Напишите функцию которая определяет сумму цифр переданного ей числа
Перейти к содержимому

Напишите функцию которая определяет сумму цифр переданного ей числа

  • автор:

Сумма и произведение цифр числа в Python

Сложить или перемножить цифры числа — задача, встречающаяся почти каждому программисту. Она позволяет не только проверить умение писать код и придумывать правильные алгоритмы, но и даёт возможность оценить синтаксис и функционал используемого языка.

Сумма цифр

Реализация программы на разных языках программирования мало чем отличается. Но из-за концепций и особенностей синтаксиса решение на языке Python получается более коротким и простым, чем, например, решение на C++.

Полный код программы нахождения суммы цифр числа на Python выглядит так:

num = int(input("Введите целое: ")) sum = 0 while (num != 0): sum = sum + num % 10 num = num // 10 print("Сумма цифр числа равна: ", sum)

В первой строке программа запрашивает ввод числа, цифры которого будут складываться.

Во второй строке объявляется переменная, в которую будет записываться сумма. Переменная обязательна должна быть равна нулю. Иначе полученная сумма будет отличаться от реальной (некоторые люди путают сложение и произведение чисел, поэтому пишут не ноль, а единицу).

В цикле while происходит суммирование цифр. В 4 строке программа получает младший разряд числа. Например, если число равно 125, программа получает 5. Полученный младший разряд прибавляется к переменной суммы.

Строка 5: использованный младший разряд отбрасывается (делится на 10), то есть если было 125, то станет 12. Обязательно необходимо использовать целочисленное деление, то есть деление без остатка, иначе цифра не отбросится, а уйдет в дробную часть результата.

В 6 строке программа выводит результат суммирования в консоль. Пример выполнения:

Введите целое: 555 Сумма цифр числа равна: 15

В этом примере мы посчитали с помощью Python сумму цифр трёхзначного числа 555.

Произведение цифр

Программа на Python для вычисления произведения цифр числа имеет похожую структуру и принцип работы. Однако есть некоторые важные отличия:

num = int(input("Введите целое: ")) mult = 1 while (num != 0): mult = mult * (num % 10) num = num // 10 print("Произведение цифр равно: ", mult)

Во-первых, переменная для хранения произведения равна единице, если присвоить ей ноль, то и само произведения будет всегда равно нулю. Во-вторых, теперь в цикле while очередная цифра не прибавляется к переменной, а является её множителем.

Важный момент, из-за того что оператор умножения имеет более высокий приоритет выполнения, чем оператор остатка от деления, выражение «num % 10» помещается в круглые скобки. Если не сделать этого, программа сначала будет умножать переменную mult на число и только потом брать от неё остаток.

Пример работы программы:

Введите целое: 55 Произведение цифр равно: 25

Частные случаи

Рассмотренные варианты программ являются самыми простыми. Однако существует ещё много частных случаев.

Число задано строкой

Когда программа получает ввод с помощью input, интерпретатор автоматически присваивает переменной строковый тип, если попытаться использовать эту переменную в вычислениях, возникнет ошибка.

В рассмотренных скриптах эта проблема была решена следующим образом:

num = int(input("Введите целое: "))

Оператор input помещается в функцию int, которая преобразует полученную строку к целому числу. В некоторых случаях бывает удобнее не преобразовывать число сразу, а сделать это непосредственно перед вычислением. Пример такого случая представлен ниже.

Задано дробное

Если пользователь вводит дробное число, стандартная реализация перестаёт работать. Дробная часть не учитывается, т.к. в программе происходит деление на 10. Даже если преобразовывать введенное число к целому с помощью int , то будут отброшены все дробные цифры.

Рассмотрим программу для вычисления произведения цифр дробного числа (аналогично с суммой):

num = input("Введите дробное: ") # разделим введённое (тип данных строка) на две части x = num.split(".") a = int(x[0]) # целая часть b = int(x[1]) # дробная часть mult = 1 while (a != 0): # перемножаем числа целой части mult = mult * (a % 10) a = a // 10 while (b != 0): # перемножаем числа дробной части mult = mult * (b % 10) b = b // 10 print("Произведение цифр равно:", mult)

Пример выполнения программы:

Введите дробное: 55.5 Произведение цифр равно: 125

Эта программа правильно вычисляет произведение цифр любого числа:

Реализация программы специально была сделана через строки, с помощью функции split введённое число делится на дробную и целую части. Дробная часть обрабатывается также, как и целая.

При приведении к действительному

Подход, описанный выше выбран потому, что из-за неточного представления десятичных дробей в двоичном виде (в котором работает компьютер), реальное представление числа отличается от ожидаемого. В итоге, если пользователь вводит число 0.55, то если привести её к действительному числу с помощью float , в переменную записывается значение 0.54999…8. В итоге, результат получается неточным, если ограничить количество итераций цикла, либо цикл является бесконечным, пример:

num = float(input("Введите дробное: ")) # Преобразуем строку в дробное a = int(num) # целая часть, например, 5 b = num - int(num) # дробная часть, например, 0.55 print("a =", a) print("b =", b) mult = 1 while (a != 0): # перемножаем числа целой части mult = mult * (a % 10) a = a // 10 while (b != 0): # b никогда не будет равно 0 mult = mult * int(b*10) # 0.55 * 10 = 5.5, int(5.5) = 5 b = b * 10 - int(b * 10) print("Произведение цифр равно:", mult)

Если бы в переменной реально было бы записано значение 5.55, то программа работала бы нормально. Однако в переменную b на самом деле помещается 0,54999… Это приводит к бесконечному выделению и отбрасыванию старшего разряда.

Вот пример вывода полученной программы:

Введите дробное: 5.55 a = 5 b = 0.5499999999999998 Произведение цифр равно: 0

Программа вывела переменную b , как 0.5499999999999998, после умножения на 10, её значение уже будет равно 5.499999999999998. Если вычесть из этого числа 5, то получим 0.4999999999999982. На конце добавилась цифра 2!

Таким образом прошло много итераций и в итоге b стало равно 0. В ходе перемножений среди цифр из которых состояло b были и нули. Поэтому результат равен 0.

Напишите функцию которая определяет сумму цифр переданного ей числа

Скачай курс
в приложении

Перейти в приложение
Открыть мобильную версию сайта

© 2013 — 2024. Stepik

Наши условия использования и конфиденциальности

Get it on Google Play

Public user contributions licensed under cc-wiki license with attribution required

Сумма цифр суммы цифр числа, пока число не станет однозначным на питоне

На вход программа получает число, которое нужно сократить до одной цифры. Например, сумма цифр числа 38578324323 равна 48. У 48 сумма цифр — 12, а у 12 — 3. Как решить? Начал решение как-то так:

num = int(input("Введите целое: ")) sum = 0 while (len(sum) >= 1) while (num != 0): sum = sum + num % 10 num = num // 10 

Отслеживать
51.6k 203 203 золотых знака 65 65 серебряных знаков 250 250 бронзовых знаков
задан 17 сен 2021 в 12:42
73 1 1 золотой знак 3 3 серебряных знака 10 10 бронзовых знаков

Добавьте пример своей попытки, а то вопрос закроют как «учебный» 🙂 Тут без рекурсии можно, просто через while . Суммировать можно через функциональную магию типа: print(sum(map(int, ‘38578324323’)))

17 сен 2021 в 12:47

Пожалуйста, уточните вашу конкретную проблему или приведите более подробную информацию о том, что именно вам нужно. В текущем виде сложно понять, что именно вы спрашиваете.

17 сен 2021 в 13:03

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

Нерекурсивное решение с использованием моржового ( walrus ) оператора, появившегося в Python 3.8:

def sum_dig(n): while (n := sum(map(int, str(n)))) > 9: pass return n 

Или обычный вариант:

def sum_dig(n): while n > 9: n = sum(map(int, str(n))) return n 

Отслеживать
ответ дан 17 сен 2021 в 12:54
MaxU — stand with Ukraine MaxU — stand with Ukraine
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака

не совсем понимаю, что значит map(int, str(n)), нужно ли оно, если я ввожу число через консоль и сразу преобразую в int?

17 сен 2021 в 13:34

@Alex, чтобы понять что здесь происходит — поэксперементируйте: n=6745; print(list(map(int, str(n)))) 😉 В приведенных мною решениях число сначала преобразовывается в список целых чисел — цифр числа, для простоты суммирования

17 сен 2021 в 13:39

Вот простенькая рекурсивная функция:

def sum_digits(n): r = sum(map(int, str(n))) return sum_digits(r) if r > 9 else r print(sum_digits(38578324323)) 

Малопонятный рекурсивный однострочник для извращенцев любителей прекрасного (работать будет только в Python 3.8+):

def sum_digits(n): return sum_digits(n) if (n := sum(map(int, str(n)))) > 9 else n 

Отслеживать
ответ дан 17 сен 2021 в 12:46
MaxU — stand with Ukraine MaxU — stand with Ukraine
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака

есть еще «читерский» способ

The digital root (also repeated digital sum) of a natural number in a given radix is the (single digit) value obtained by an iterative process of summing digits, on each iteration using the result from the previous iteration to compute a digit sum. The process continues until a single-digit number is reached. In base 10, this is equivalent to taking the remainder upon division by 9 (except when the digital root is 9, where the remainder upon division by 9 will be 0).

num = int(input("Введите целое: ")) sum_ = 9 if not num%9 else num%9 

Отслеживать
ответ дан 17 сен 2021 в 15:57
5,645 1 1 золотой знак 7 7 серебряных знаков 17 17 бронзовых знаков
wow, этот метод прекрасен! 🙂
19 сен 2021 в 10:13

def sum_digits(n): return (n - 1) % 9 + 1 

ПОМОГИТЕ РЕШИТЬ C++

Напишите функцию, которая определяет сумму цифр переданного ей числа. Пример: Введите натуральное число: 123 Сумма цифр числа 123 равна 6.

Лучший ответ

int sumDig(long x)<
int s=0;
if (x<0) x=-x;
while (x>0)
return s;
>

Остальные ответы

#include
#include
using namespace std;
unsigned sum_digits(unsigned long long number) auto line = to_string(number);
auto length = line.length();
auto digits = line.data();
auto sum = 0U;
for (auto i = 0; i < length; ++i) sum += digits[i] - 48;
return sum;
>
int main() system(«chcp 1251 > nul»);
cout unsigned long long number;
cin >> number;
auto result = sum_digits(number);
cout system(«pause»);
>

Похожие вопросы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *