Сумма цифр трехзначного числа
Как извлечь отдельные цифры из числа? Если число разделить нацело на десять, в остатке будет последняя цифра этого числа. Например, если 349 разделить нацело на 10, то получится частное 34 и остаток 9. Если потом 34 разделить также, получится частное 3 и остаток 4; далее при делении 3 на 10 получим частное 0 и остаток 3.
В языках программирования почти всегда есть две операции:
1) нахождение целого при делении нацело,
2) нахождение остатка при делении нацело.
В языке программирования Python первая операция обозначается // (двумя знаками деления), а вторая — % (знаком процента). Например:
>>> 34 // 10 3 >>> 34 % 10 4
Примечание. Операции деления нацело и нахождения остатка с точки зрения арифметики применимы только к целым числам. Но в Python их можно использовать и по отношению к дробным числам:
>>> 34.5 % 10 4.5 >>> 34.5 // 10 3.0 >>> 34.5 // 12.9 2.0
Алгоритм нахождения суммы цифр трехзначного числа abc (где a — сотни, b — десятки и c — единицы) можно описать так:
- Найти остаток от деления abc на 10, записать его в переменную d1 . Это будет цифра c.
- Избавиться от цифры c в числе abc, разделив его нацело на 10.
- Найти остаток от деления ab на 10, записать его в переменную d2 . Это будет цифра b.
- Избавиться от цифры b в числе ab, разделив его нацело на 10.
- Число a однозначное. Это еще одна цифра исходного числа.
- Сложить оставшееся число a со значениями переменных d1 и d2 .
n = input("Введите трехзначное число: ") n = int(n) d1 = n % 10 n = n // 10 d2 = n % 10 n = n // 10 print("Сумма цифр числа:", n + d2 + d3)
Пример выполнения программы:
Введите трехзначное число: 742 Сумма цифр числа: 13
Однако, если нам известно, что число состоит из трех разрядов (цифр), есть немного другой способ извлечения цифр из числа:
- Остаток от деления на 10 исходного числа дает последнюю цифру числа.
- Если найти остаток от деления на 100 исходного числа, то мы получи последние две цифры числа. Далее следует разделить полученное двухзначное число нацело на 10, и у нас окажется вторая цифра числа.
- Если исходное трехзначное число разделить нацело на 100, то получится первая цифра числа.
n = input("Введите трехзначное число: ") n = int(n) d1 = n % 10 d2 = n % 100 // 10 d3 = n // 100 print("Сумма цифр числа:", d1 + d2 + d3)
В Python данную задачу можно решить без использования арифметических действий, а путем извлечения из исходной строки отдельных символов с последующим их преобразованием к целому.
n = input("Введите трехзначное число: ") # Извлекается первый[0] символ строки, # преобразуется к целому. # Аналогично второй[1] и третий[2]. a = int(n[0]) b = int(n[1]) c = int(n[2]) print("Сумма цифр числа:", a + b + c)
Задача может быть усложнена тем, что число вводится не пользователем с клавиатуры, а должно быть сгенерировано случайно. Причем обязательно трехзначное число.
В этом случае надо воспользоваться функциями randint() , randrange() или random() из модуля random . Первым двум функциям передаются диапазоны: randint(100, 999) , randrange(100, 1000) . Получить трехзначное число, используя random() немного сложнее:
# Функция random генерирует # случайное дробное число от 0 до 1 from random import random # При умножении на 900 получается случайное # число от 0 до 899.(9). # Если прибавить 100, то получится # от 100 до 999.(9). n = random() * 900 + 100 # Отбрасывается дробная часть, # число выводится на экран n = int(n) print(n) # Извлекается старший разряд числа # путем деления нацело на 100 a = n // 100 # Деление нацело на 10 удаляет # последнюю цифру числа. # Затем нахождение остатка при # делении на 10 извлекает последнюю цифру, # которая в исходном числе была средней. b = (n // 10) % 10 # Младший разряд числа находится # как остаток при делении нацело на 10. c = n % 10 print(a+b+c)
X Скрыть Наверх
Решение задач на Python
Напишите программу которая считает сумму цифр введенного числа
Скачай курс
в приложении
Перейти в приложение
Открыть мобильную версию сайта
© 2013 — 2024. Stepik
Наши условия использования и конфиденциальности
Public user contributions licensed under cc-wiki license with attribution required
Сумма и произведение цифр числа в 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.
Сумма цифр суммы цифр числа, пока число не станет однозначным на питоне
На вход программа получает число, которое нужно сократить до одной цифры. Например, сумма цифр числа 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 204 204 золотых знака 67 67 серебряных знаков 251 251 бронзовый знак
задан 17 сен 2021 в 12:42
73 1 1 золотой знак 3 3 серебряных знака 11 11 бронзовых знаков
Добавьте пример своей попытки, а то вопрос закроют как «учебный» 🙂 Тут без рекурсии можно, просто через 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 серебряных знаков 133 133 бронзовых знака
не совсем понимаю, что значит 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 серебряных знаков 133 133 бронзовых знака
есть еще «читерский» способ
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,665 1 1 золотой знак 7 7 серебряных знаков 17 17 бронзовых знаков
wow, этот метод прекрасен! 🙂
19 сен 2021 в 10:13
def sum_digits(n): return (n - 1) % 9 + 1