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

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

Дано число. Найти сумму и произведение его цифр.
Вычисление суммы и произведения цифр числа на языке программирования Python
#
×

Решение задачи на языке программирования Python

Например, сумма цифр числа 253 равна 10-ти, так как 2 + 5 + 3 = 10. Произведение цифр числа 253 равно 30-ти, так как 2 * 5 * 3 = 30.

В данном случае задача осложняется тем, что количество разрядов числа заранее (на момент написания программы) не известно. Это может быть и трехзначное число, как в примере выше, и восьмизначное, и однозначное.

Обычно предполагается, что данная задача должна быть решена арифметическим способом и с использованием цикла. То есть с заданным число должны последовательно выполняться определенные арифметические действия, позволяющие извлечь из него все цифры, затем сложить их и перемножить.

При этом используются операции деления нацело и нахождения остатка. Если число разделить нацело на 10, произойдет потеря последней цифры числа. Например, 253 ÷ 10 = 25 (остаток 3). С другой стороны, эта потерянная цифра есть остаток от деления. Получив эту цифру, мы можем добавить ее к сумме цифр и умножить на нее произведение цифр числа.

Пусть n — само число, suma — сумма его цифр, а mult — произведение. Тогда алгоритм нахождения суммы и произведения цифр можно словесно описать так:

  1. Переменной suma присвоить ноль.
  2. Переменной mult присвоить единицу. Присваивать 0 нельзя, так как при умножении на ноль результат будет нулевым.
  3. Пока значение переменной n больше нуля повторять следующие действия:
    1. Найти остаток от деления значения n на 10, то есть извлечь последнюю цифру числа.
    2. Добавить извлеченную цифру к сумме и увеличить на эту цифру произведение.
    3. Избавиться от последнего разряда числа n путем деления нацело на 10.

В языке Python операция нахождения остатка от деления обозначается знаком процента — %. Деление нацело — двумя слэшами — //.

Код программы на языке Python

n = int(input())

suma = 0
mult = 1

while n > 0:
    digit = n % 10
    suma = suma + digit
    mult = mult * digit
    n = n // 10

print("Сумма:", suma)
print("Произведение:", mult)

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

253
Сумма: 10
Произведение: 30
Python. Вычисление суммы и произведения цифр числа

Изменение значений переменных можно записать в сокращенном виде:

...
while n > 0:
    digit = n % 10
    suma += digit
    mult *= digit
    n //= 10
...

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

Если число отрицательное, это не влияет на сумму его цифр. В таком случае достаточно будет использовать встроенную в Python функции abc, которая возвращает абсолютное значение переданного ей аргумента. Она превратит отрицательное число в положительное, и цикл while с его условием n > 0 будет работать как и прежде.

Если число равно нулю, то по логике вещей сумма его цифр и их произведение должны иметь нулевые значения. Цикл срабатывать не будет. Поскольку исходное значение mult — это 1, следует добавить проверку на случай, если заданное число — это ноль.

Программа, обрабатывающая все целые числа, может начинаться так:

n = abs(int(input()))

suma = 0
mult = 1
if n == 0:
    mult = 0
...

Заметим, если в самом числе встречается цифра 0 (например, 503), то произведение всех цифр будет равно нулю. Усложним задачу:

Вводится натуральное число. Найти сумму и произведение цифр, из которых состоит это число. При этом если в числе встречается цифра 0, то ее не надо учитывать при нахождении произведения.

Для решения такой задачи в цикл добавляется проверка извлеченной цифры на ее неравенство нулю. Делать это надо до умножения на нее значения переменной-произведения.

n = int(input())

suma = 0
mult = 1

while n > 0:
    digit = n % 10
    if digit != 0:
        suma += digit
        mult *= digit
    n = n // 10

print("Сумма:", suma)
print("Произведение:", mult)

Обратим внимание, что заголовок условного оператора if digit != 0: в Python можно сократить до просто if digit:. Потому что 0 — это False. Все остальные числа считаются истиной.

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

a = input()

suma = 0
mult = 1

for digit in a:
    suma += int(digit)
    mult *= int(digit)

print("Сумма:", suma)
print("Произведение:", mult)

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

n = input()

suma = 0
mult = 1

for digit in n:
    if digit.isdigit():
        suma += int(digit)
        mult *= int(digit)

print("Сумма:", suma)
print("Произведение:", mult)

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

это3 чи3с9ло!
Сумма: 15
Произведение: 81

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

Глубокое знание языка Python позволяет решать задачу более экзотическими способами:

import functools

n = input()
n = [int(digit) for digit in n]

suma = sum(n)
mult = functools.reduce(lambda x, y: x*y, n)

print("Сумма:", suma)
print("Произведение:", mult)

Выражение [int(digit) for digit in n] представляет собой генератор списка. Если была введена строка "234", будет получен список чисел: [2, 3, 4].

Встроенная функция sum считает сумму элементов переданного ей аргумента.

Функция reduce модуля functools принимает два аргумента - лямбда-выражение и в данном случае список. Здесь в переменной x происходит накопление произведения, а y принимает каждое следующее значение списка.