Сумма и произведение цифр числа в Python
Сложить или перемножить цифры числа — задача, встречающаяся почти каждому программисту. Она позволяет не только проверить умение писать код и придумывать правильные алгоритмы, но и даёт возможность оценить синтаксис и функционал используемого языка.
Сумма цифр
Реализация программы на разных языках программирования мало чем отличается. Но из-за концепций и особенностей синтаксиса решение на языке Python получается более коротким и простым, чем, например, решение на C++.
Полный код программы нахождения суммы цифр числа на Python выглядит так:
В первой строке программа запрашивает ввод числа, цифры которого будут складываться.
Во второй строке объявляется переменная, в которую будет записываться сумма. Переменная обязательна должна быть равна нулю. Иначе полученная сумма будет отличаться от реальной (некоторые люди путают сложение и произведение чисел, поэтому пишут не ноль, а единицу).
В цикле while происходит суммирование цифр. В 4 строке программа получает младший разряд числа. Например, если число равно 125, программа получает 5. Полученный младший разряд прибавляется к переменной суммы.
Строка 5: использованный младший разряд отбрасывается (делится на 10), то есть если было 125, то станет 12. Обязательно необходимо использовать целочисленное деление, то есть деление без остатка, иначе цифра не отбросится, а уйдет в дробную часть результата.
В 6 строке программа выводит результат суммирования в консоль. Пример выполнения:
В этом примере мы посчитали с помощью Python сумму цифр трёхзначного числа 555.
Произведение цифр
Программа на Python для вычисления произведения цифр числа имеет похожую структуру и принцип работы. Однако есть некоторые важные отличия:
Во-первых, переменная для хранения произведения равна единице, если присвоить ей ноль, то и само произведения будет всегда равно нулю. Во-вторых, теперь в цикле while очередная цифра не прибавляется к переменной, а является её множителем.
Важный момент, из-за того что оператор умножения имеет более высокий приоритет выполнения, чем оператор остатка от деления, выражение «num % 10» помещается в круглые скобки. Если не сделать этого, программа сначала будет умножать переменную mult на число и только потом брать от неё остаток.
Пример работы программы:
Частные случаи
Рассмотренные варианты программ являются самыми простыми. Однако существует ещё много частных случаев.
Число задано строкой
Когда программа получает ввод с помощью input, интерпретатор автоматически присваивает переменной строковый тип, если попытаться использовать эту переменную в вычислениях, возникнет ошибка.
В рассмотренных скриптах эта проблема была решена следующим образом:
Задано дробное
Рассмотрим программу для вычисления произведения цифр дробного числа (аналогично с суммой):
Пример выполнения программы:
Эта программа правильно вычисляет произведение цифр любого числа:
При приведении к действительному
Если бы в переменной реально было бы записано значение 5.55, то программа работала бы нормально. Однако в переменную b на самом деле помещается 0,54999… Это приводит к бесконечному выделению и отбрасыванию старшего разряда.
Вот пример вывода полученной программы:
Таким образом прошло много итераций и в итоге b стало равно 0. В ходе перемножений среди цифр из которых состояло b были и нули. Поэтому результат равен 0.
Функция sum() в Python: питонический способ суммирования значений
Давайте разберем, что такое функция sum() в Python и почему это питонический способ суммирования.
Встроенная функция sum() – это эффективный и питонический способ суммирования списка числовых значений. Сложение нескольких чисел является обычным промежуточным шагом во многих вычислениях, поэтому sum() – довольно удобный инструмент для программиста Python.
Еще с помощью sum() можно объединять списки и кортежи. Это интересный дополнительный вариант использования, полезный, когда вам нужно сгладить список списков.
Приведенная ниже информация поможет вам эффективно решать проблемы суммирования в вашем коде с помощью sum() или других альтернативных и специализированных инструментов.
Понимание проблемы суммирования
Суммирование числовых значений – довольно распространенная задача в программировании. Например, предположим, что у вас есть список чисел a = [1, 2, 3, 4, 5] и вы хотите сложить элементы и получить сумму. Используя стандартную арифметику, вы сделаете что-то вроде этого:
Что касается математики, это выражение довольно простое.
Можно выполнить этот конкретный расчет вручную, но представьте себе другие ситуации, в которых это может быть невозможно. Если у вас очень длинный список чисел, добавление вручную будет неэффективным и, скорее всего, вы допустите ошибку. А если вы даже не знаете, сколько элементов в списке? Наконец, представьте сценарий, в котором количество элементов, которые вам нужно добавить, изменяется динамически или вообще непредсказуемо.
В подобных ситуациях, независимо от того, есть ли у вас длинный или короткий список чисел, Python может быть весьма полезен для решения задач суммирования.
Использование цикла for
Если вы хотите суммировать числа, создав собственное решение с нуля, вы можете использовать цикл for :
Здесь вы сначала инициализируете сумму и приравниваете её к 0. Эта переменная работает как аккумулятор, в котором вы сохраняете промежуточные результаты, пока не получите окончательный. Цикл перебирает числа и обновляет общее количество.
Цикл for можно заключить в функцию. Благодаря этому вы сможете повторно использовать код для разных списков:
В sum_numbers() вы берете итерируемый объект в качестве аргумента и возвращаете общую сумму значений элементов списка.
Использование рекурсии
Вы также можете использовать рекурсию вместо итерации. Рекурсия – это метод функционального программирования, при котором функция вызывается в пределах ее собственного определения. Другими словами, рекурсивная функция вызывает сама себя в цикле:
Когда вы определяете рекурсивную функцию, вы рискуете попасть в бесконечный цикл. Чтобы предотвратить это, нужно определить как базовый случай, останавливающий рекурсию, так и рекурсивный случай для вызова функции и запуска неявного цикла.
В приведенном выше примере базовый случай подразумевает, что сумма списка нулевой длины равна 0. Рекурсивный случай подразумевает, что общая сумма – это первый элемент плюс сумма остальных элементов. Поскольку рекурсивный случай использует более короткую последовательность на каждой итерации, вы ожидаете столкнуться с базовым случаем, когда числа представляют собой список нулевой длины.
Марк Лутц «Изучаем Python»
Скачивайте книгу у нас в телеграм
Использование reduce()
Вы можете вызвать reduce() с folding-функцией и итерируемым объектом в качестве аргументов. reduce() использует переданную функцию для обработки итерируемого объекта и вернет единственное кумулятивное значение.
Во втором примере folding-функция – это лямбда-функция, которая возвращает сложение двух чисел.
Поскольку суммирование является обычным явлением в программировании, писать новую функцию каждый раз, когда нам нужно сложить какие-нибудь числа, — бессмысленная работа. Кроме того, использование reduce() – далеко не самое удобочитаемое решение.
Начало работы с sum()
В настоящее время функция sum() является предпочтительным способом для суммирования элементов:
У sum() есть два аргумента:
Суммирование числовых значений
Вот несколько примеров использования sum() со значениями разных числовых типов:
Объединение последовательностей
Несмотря на то, что функция sum() в основном предназначена для работы с числовыми значениями, вы также можете использовать ее для объединения последовательностей, таких как списки и кортежи. Для этого вам нужно указать соответствующее значение для аргумента start :
Примеры использования sum() в Python
Кроме того, мы разберем, как применять sum() при работе со списками и кортежами. Мы также рассмотрим особый пример, когда нужно объединить несколько списков.
Расчет среднего значения выборки
Один из практических вариантов применения sum() – использовать ее в качестве промежуточного вычисления перед дальнейшими вычислениями. Например, вам нужно вычислить среднее арифметическое для выборки числовых значений. Среднее арифметическое, также известное как среднее значение, представляет собой общую сумму значений, деленную на количество значений в выборке.
Если у вас есть выборка [2, 3, 4, 2, 3, 6, 4, 2] и вы хотите вычислить среднее арифметическое вручную, вы можете решить эту операцию так:
(2 + 3 + 4 + 2 + 3 + 6 + 4 + 2) / 8 = 3,25
Нахождение скалярного произведения двух последовательностей
1 × 4 + 2 × 5 + 3 × 6 = 32
Чтобы извлечь последовательные пары значений, мы можем использовать zip(). Затем воспользуемся генератором для умножения каждой пары значений. Наконец, sum() поможет суммировать произведения:
Объединение списков
Но можно ли использовать функцию sum() для объединения списков, как в примере выше? Да! Вот как:
Это было быстро! Одна строка кода — и мы получили единый список. Однако использование sum() не кажется самым быстрым решением.
Важным недостатком любого решения, предполагающего конкатенацию, является то, что за кулисами каждый промежуточный шаг создает новый список. Это может быть довольно расточительным с точки зрения использования памяти.
Список, который в итоге возвращается, является самым последним созданным списком из всех, которые создавались на каждом этапе конкатенации. Использование генератора списка вместо этого гарантирует, что вы создадите и вернете только один список:
Эта новая версия flatten_list() более эффективна и менее расточительна с точки зрения использования памяти. Однако вложенные генераторы могут быть сложными для чтения и понимания.
Альтернативы sum()
Суммирование чисел с плавающей запятой: math.fsum()
Согласно документации, fsum() «позволяет избежать потери точности, отслеживая несколько промежуточных частичных сумм». В документации приводится следующий пример:
В этих примерах обе функции возвращают одинаковый результат. Это связано с невозможностью точного представления значений 0,1 и 0,2 в двоичной системе с плавающей запятой:
Объединение объектов с помощью itertools.chain()
chain() также является хорошим вариантом для объединения списков в Python:
Объединение строк с помощью str.join()
Заключение
Итак, сегодня мы разобрали, что такое функция sum() в Python. Теперь вы можете использовать её для сложения числовых значений. Эта функция обеспечивает эффективный, читаемый и питонический способ решения задач сложения в коде. Также мы поговорили про альтернативы функции sum() и в каких случаях их лучше использовать.
Сумма цифр трехзначного числа. Решение задачи на Python
Вводится трехзначное число. Написать программу, которая вычисляет сумму его цифр.
(Это задача на линейные алгоритмы, если требуется найти сумму цифр числа произвольной длины с помощью цикла см. задачу «Сумма и произведение цифр числа».)
Например, если было введено 349, программа должна вывести на экран число 16, так как 3 + 4 + 9 = 16.
Как извлечь отдельные цифры из числа? Если число разделить нацело на десять, в остатке будет последняя цифра этого числа. Например, если 349 разделить нацело на 10, то получится частное 34 и остаток 9. Если потом 34 разделить также, получится частное 3 и остаток 4; далее при делении 3 на 10 получим частное 0 и остаток 3.
В языках программирования почти всегда есть две операции:
1) нахождение целого при делении нацело,
2) нахождение остатка при делении нацело.
Примечание. Операции деления нацело и нахождения остатка с точки зрения арифметики применимы только к целым числам. Но в Python их можно использовать и по отношению к дробным числам:
Пример выполнения программы:
Однако, если нам известно, что число состоит из трех разрядов (цифр), есть немного другой способ извлечения цифр из числа:
В Python данную задачу можно решить без использования арифметических действий, а путем извлечения из исходной строки отдельных символов с последующим их преобразованием к целому.
Задача может быть усложнена тем, что число вводится не пользователем с клавиатуры, а должно быть сгенерировано случайно. Причем обязательно трехзначное число.
Сумма и произведение цифр числа
Одной из часто используемых задач для начинающих изучать программирование является нахождение суммы и произведения цифр числа. Число может вводиться с клавиатуры или генерироваться случайное число. Задача формулируется так:
Дано число. Найти сумму и произведение его цифр.
Например, сумма цифр числа 253 равна 10-ти, так как 2 + 5 + 3 = 10. Произведение цифр числа 253 равно 30-ти, так как 2 * 5 * 3 = 30.
Обычно предполагается, что данная задача должна быть решена арифметическим способом. То есть с заданным число должны производиться определенные арифметические действия, позволяющие извлечь из него все цифры, затем сложить их и перемножить.
И здесь на помощь приходят операции деления нацело и нахождения остатка. Если число разделить нацело на 10, произойдет «потеря» последней цифры числа. Например, 253 ÷ 10 = 25 (остаток 3). С другой стороны, эта потерянная цифра есть остаток от деления. Получив эту цифру, мы можем добавить ее к сумме цифр и умножить на нее произведение цифр числа.
Пусть n – само число, suma – сумма его цифр, а mult – произведение. Тогда алгоритм нахождения суммы и произведения цифр можно словесно описать так:
Код программы на языке Python
Изменение значений переменных можно записать в сокращенном виде:
Приведенная выше программа подходит только для нахождения суммы и произведения цифр натуральных чисел, то есть целых чисел больше нуля. Если исходное число может быть любым целым, следует учесть обработку отрицательных чисел и нуля.
Если число отрицательное, это не влияет на сумму его цифр. В таком случае достаточно будет использовать встроенную в Python функции abc(), которая возвращает абсолютное значение переданного ей аргумента. Она превратит отрицательное число в положительное, и цикл while с его условием n > 0 будет работать как и прежде.
Программа, обрабатывающая все целые числа, может начинаться так:
Заметим, если в самом числе встречается цифра 0 (например, 503), то произведение всех цифр будет равно нулю. Усложним задачу:
Вводится натуральное число. Найти сумму и произведение цифр, из которых состоит это число. При этом если в числе встречается цифра 0, то ее не надо учитывать при нахождении произведения.
Для решения такой задачи в цикл добавляется проверка извлеченной цифры на ее неравенство нулю. Делать это надо до умножения на нее значения переменной-произведения.
Приведенный выше математический алгоритм нахождения суммы и произведения цифр числа можно назвать классическим, или универсальным. Подобным способом задачу можно решить на всех императивных языках, независимо от богатства их инструментария. Однако средства языка программирования могут позволить решить задачу другим, зачастую более простым, путем. Например, в Python можно не преобразовывать введенную строку с числу, а извлекать из нее отдельные символы, которые преобразовывать к целочисленному типу int:
Если добавить в код проверку, что извлеченный символ строки действительно является цифрой, то программа станет более универсальной. С ее помощью можно будет считать не только сумму и произведение цифр целых чисел, но и вещественных, а также цифр, извлекаемых из произвольной строки.
Строковый метод isdigit() проверяет, состоит ли строка только из цифр. В нашем случае роль строки играет одиночный, извлеченный на текущей итерации цикла, символ.
Глубокое знание языка Python позволяет решить задачу более экзотическими способами:
Встроенная функция sum() считает сумму элементов переданного ей аргумента.
Сумма трех, четырех и так далее чисел — на Python
Давайте рассмотрим довольно классическую задачку на программирование под названием «Сумма трех чисел» (и производную от нее — «Сумму четырех чисел»). Решать будем брутфорс-методом, а затем усовершенствуем решение при помощи рекурсии так, чтобы оно подходило для любой задачи «Сумма K чисел». Вы увидите, что хотя брутфорс-решение не очень хорошо масштабируется, оно все равно не бесполезно.
Давайте начнем с простого варианта задачи — суммы трех чисел. Вот условие:
Нам дается список чисел, в котором нужно найти три числа, в сумме дающих нуль (или любое другое указанное число). Как бы вы это решили?
1. Подход
Но есть одна заковыка: в выводе не должно быть дубликатов троек. Как нам это учесть? Вероятно, вы подумали об использовании множеств, и — да, именно их мы и используем. Мы превратим каждую найденную тройку в строку и поместим во множество, таким образом гарантируя отсутствие повторов.
2. Подготовка
3. Итерации
В первом цикле мы начинаем с первого числа в списке и доходим до третьего с конца. Почему? Нам нужны два дополнительных числа, с которыми мы будем сопоставлять число в цикле, а когда мы дойдем до предпоследнего, у нас просто не останется достаточного количества чисел, чтобы составить из них тройку.
В качестве напоминания: функция range() принимает два аргумента. Синтаксис:
Первые два аргумента задают диапазон, причем первый (start) включается в него, а второй (end) — не включается. Третий аргумент (step) опционален и задает шаг. Если он не указан, то по умолчанию шаг равен 1.
Но первый аргумент тоже опционален. Если его не указывать, по умолчанию стартовая позиция — 0.
Отлично, теперь переходим ко второму, вложенному циклу.
Наконец, давайте напишем самый внутренний цикл. С индексами уже должно быть понятно. Мы начинаем с j + 1 и идем до конца.
4. Заканчиваем работать над задачей «Сумма трех чисел»
Маленький пример для тестирования метода:
5. Наращиваем сложность: сумма четырех чисел
Теперь, когда вы счастливо перевели дух, покончив с суммой трех чисел, как насчет суммы четырех?
Хотя кажется, что эта задача сложнее, по сути, мы можем использовать все тот же брутфорс-метод. Я знаю, что временная сложность и так была ужасной — O(N 3 ), а теперь станет еще хуже — O(N 4 ). Но, как говорится, «зато работает».
Он точно такой же, как для «Суммы трех чисел», только с дополнительным циклом. Мы можем проверить его работу:
6. Сумма пяти чисел и так далее
Вы написали метод для суммы трех чисел и для суммы четырех, и уже должны чувствовать себя достаточно уверенно. А что, если попросить вас теперь решить задачку с суммой пяти чисел?
Итак, давайте сделаем такой же метод, как раньше, только теперь он будет принимать еще и аргумент k — количество чисел, сумма которых должна быть равна target (три, четыре, пять и т. д. чисел).
7. Итерация с рекурсивным методом
Нашему рекурсивному методы нужен базовый случай. Если k равна 0, нам не нужно ничего делать. В этом случае мы просто выходим из функции ( return ).
Теперь нам нужно вычесть число из рабочей target и написать наш рекурсивный случай. Но погодите, мы же можем сделать это за один шаг! Вот рекурсивный вызов:
Наконец, нам нужно откатить назад добавление числа в current :
Вот и все! Вместе наши методы выглядят следующим образом:
Не стоит забывать, что это — брутфорс-решение. Его временная сложность — O(N k ), а это очень плохо, если k оказывается большим числом. Вероятно, эту задачу можно решить более элегантно. Если вы знаете, как, — добро пожаловать в комментарии!