Количество и сумма цифр числа на C++
Примеры:
123 — 3 цифры.
45677 — 5 цифр.
Подход к решению такой:
1. если число отрицательное — то меняем знак;
2. заводим счетчик, изначально равный нулю;
3. делим число на 10 без остатка, например при делении 123 на 10 получится 12. Таким образом, мы «отбросили» младший разряд (цифру);
4. увеличиваем счетчик (ведь одну цифру отбросили);
5. если число больше нуля — переходим на п. 2.
6. счетчик содержит результат работы программы.
Исходный код программы:
Вычисление суммы цифр числа можно сделать так:
1) Преобразовать число в строку (различными способами) и найти сумму символов в ней;
2) Использовать операцию получения остатка от деления деления на 10 (вернет младший разряд числа) и целочисленного деления на 10 (эквивалентна сдвигу числа вправо) — такой подход уже использовался выше при вычислении количества цифр.
Как сложить цифры разрядов числа?
Например, есть число — 1204. Надо, чтобы оно сложило цифры каждого разряда (1 + 2 + 0 + 4). Как это сделать?
![]()
![]()
![]()
![]()
Я бы учел, что число может быть отрицательным. Ну и еще один вариант:
![]()
Раз тут начались споры, что быстрее. Эксперимент
(полный код здесь) дает на моей машине (VC++ 2019) и на Ideone (GCC) следующие результаты в мкс:
Так что моя рекомендация — принять ответ olkhovich — остается в силе 🙂
![]()
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Сумма цифр в C #
Какая самая быстрая и простая в чтении реализация вычисления суммы цифр?
т.е. Учитывая число: 17463 = 1 + 7 + 4 + 6 + 3 = 21
15 ответов
Вы можете сделать это арифметически, не используя строку:
Он использует только одну строку кода.
Для целых чисел Greg Hewgill имеет большую часть ответа, но забывает учитывать n < 0. Сумма цифр -1234 должна быть равна 10, а не -10.
Это число является числом с плавающей запятой, следует использовать другой подход, и решение хаоумана полностью потерпит неудачу, когда оно достигнет десятичной точки.
Я думал, что просто отправлю это ради завершения:
Если вам нужна рекурсивная сумма цифр, например: 17463 → 1 + 7 + 4 + 6 + 3 = 21 → 2 + 1 = 3
то лучшим решением было бы
Мне нравится ответ chaowman, но он будет делать одно изменение
Я даже не уверен, что c — ‘0’, синтаксис будет работать? (вычитание двух символов должно дать персонажу в результате, я думаю?)
Я думаю, что это самая читаемая версия (использование суммы слова в сочетании с выражением лямбда, показывающее, что вы сделаете это для каждого char). Но, действительно, я не думаю, что это будет самый быстрый.
Это означает, что сумма цифр между 0-9
Я бы предположил, что самая простая для чтения реализация будет выглядеть примерно так:
Это работает и довольно легко читается. BTW: Convert.ToInt32 (‘3’) дает 51, а не 3. Convert.ToInt32 (‘3’ — ‘0’) дает 3.
Я бы предположил, что самая быстрая реализация — это арифметическое решение Грега Хьюджилла.
Удивленно никто не рассматривал метод подстроки. Не знаю, эффективнее ли это или нет. Для тех, кто знает, как использовать этот метод, он вполне интуитивно понятен для таких случаев.
А назад, мне пришлось найти цифру, сумму чего-то. Я использовал код Мухаммада Хасана Хана, однако он продолжал возвращать правильное число как повторяющееся десятичное число, то есть когда цифра была равна 4, я бы получил 4.44444444444444 и т.д. Поэтому я отредактировал его, получив правильную цифру, каждый раз с помощью этого кода:
где a — это число, цифра которого вы хотите, n — это двойное значение, используемое для этого процесса, sumD — это сумма цифр в double, а sumI — сумма цифр в целочисленном размере, поэтому правильная сумма цифр.
C2017/Сумма цифр
Посчитать сумму цифр в десятичном представлении 32-битного числа.
Решение на ассемблере
Язык ассемблера определяется архитектурой процессора, на котором будет выполняться программа. Студенты на ФПМИ обычно не сталкиваются с другой архитектурой, кроме x86, и не видели другого ассемблера. К тому же механизм вызова функции и передачи параметров в неё зависит от используемой операционной системы (чтобы можно было нашу функцию на ассемблере просто вызвать из кода основной программы на C, нужно следовать этим соглашениям).
Договоримся, что будем решать задачу на Linux x86-64.
Ассемблер транслирует мнемонические команды напрямую в машинный код процессора.
Коды инструкций процессора можно проверить по документации Intel. Например, 0x89 — это mov.
Решение на C
Никаких хитростей, делаем «в лоб». Код sum.c
Код автоматически подходит под любую архитектуру и любую ОС, где есть компилятор C.
Сравниваем
Файл main.c
Но как.
Хотя инструкций больше, код работает быстрее. Никогда нельзя судить о производительности кода по числу операций.
В коде вообще нет деления. Компилятор заменяет a / b на a * (2 n / b) >> n, выбирая подходящее n.
В данном случае [math]n = 35[/math] , тогда [math]2^n / 10 \approx 3435973837[/math] (см. константу 0xcccccccd в коде).
Онлайн
Существует онлайн-сервис Compiler Explorer [1], который позволяет быстро посмотреть, какой машинный код генерирует тот или иной компилятор.