Решение задач на Python: практические примеры с кодом
Примеры задач по Python с решениями
Как найти сумму цифр целого числа, используя наиболее эффективный подход?
Оптимальное решение основано на выделении последней цифры через остаток от деления на 10 и целочисленном делении для отбрасывания этой цифры. Алгоритм работает за O(log n) по времени и O(1) по памяти.
def digit_sum_base(n):
n = abs(n) # учёт отрицательных чисел
total = 0
while n > 0:
total += n % 10
n //= 10
return total
# Пример использования
print(digit_sum_base(1234)) # 10
print(digit_sum_base(-567)) # 18
задачи с решениями с циклами python (задачи на циклы с решениями в python)
На каждом шаге к сумме прибавляется последняя цифра, затем число уменьшается на один разряд. Цикл продолжается, пока число не станет равным нулю. Модуль числа берётся в начале, чтобы корректно обрабатывать отрицательные значения.
Как вычислить сумму цифр с помощью строкового представления?
Данный вариант преобразует число в строку, итерирует по символам и преобразует каждый обратно в целое число. Это менее эффективно из-за накладных расходов на преобразование, но код получается лаконичным.
def digit_sum_str(n):
return sum(int(digit) for digit in str(abs(n)))
print(digit_sum_str(2024)) # 8
задача примеры python (примеры задач по python с решениями)
Типичная ошибка: забыть взять модуль числа. Если передать отрицательное число, str(abs(n)) исправляет ситуацию, но без abs() строка будет содержать знак минус, и int('-') вызовет исключение.
Как реализовать рекурсивное вычисление суммы цифр?
Рекурсивный подход делит задачу на подзадачи: сумма последней цифры и суммы цифр оставшегося числа. Базовый случай – число равно 0.
def digit_sum_rec(n):
n = abs(n)
if n == 0:
return 0
return n % 10 + digit_sum_rec(n // 10)
print(digit_sum_rec(9876)) # 30
Проблема: глубина рекурсии может превысить лимит для больших чисел (например, число с миллионом цифр). В Python по умолчанию лимит около 1000. Для таких случаев предпочтительнее итеративный метод.
Как применить reduce из functools для суммирования цифр?
Функция reduce последовательно применяет операцию сложения к цифрам числа. Совмещается со строковым представлением.
from functools import reduce
def digit_sum_reduce(n):
return reduce(lambda acc, d: acc + int(d), str(abs(n)), 0)
print(digit_sum_reduce(135)) # 9
Начальное значение аккумулятора 0, на каждом шаге к нему прибавляется очередная цифра, преобразованная из символа.
Частые ошибки при работе с суммой цифр:
- Использование
n % 10для отрицательных чисел без взятия модуля – модуль даст отрицательный остаток, что приведёт к неверной сумме. - Забывание учесть случай
n == 0– возвращается 0, что корректно. - Превышение лимита рекурсии при рекурсивном решении.
- Неправильное преобразование строки:
int('-')вызывает ValueError.
Дополнительные примеры расширяют понимание и демонстрируют нестандартные ситуации.
Как вычислить сумму цифр для чисел с плавающей точкой?
Если требуется суммировать цифры дробной части или всего числа, можно преобразовать число в строку с учётом десятичной точки.
def digit_sum_float(n):
# убираем знак и точку, суммируем все цифры
s = str(n).replace('.', '').replace('-', '')
return sum(int(ch) for ch in s if ch.isdigit())
print(digit_sum_float(12.345)) # 1+2+3+4+5 = 15
print(digit_sum_float(-0.56)) # 0+5+6 = 11
15 11
Как найти сумму цифр в двоичной, восьмеричной или шестнадцатеричной системе?
Стандартные функции bin(), oct(), hex() возвращают строку с префиксом ('0b', '0o', '0x'). Нужно отбросить префикс и суммировать цифры, интерпретируя их как десятичные цифры (для hex цифры A-F тоже должны быть преобразованы в числа).
def digit_sum_base_system(n, base=10):
# возвращает сумму цифр числа n в заданной системе счисления (2,8,10,16)
if base == 10:
return sum(int(d) for d in str(abs(n)))
elif base == 2:
s = bin(abs(n))[2:] # убираем '0b'
return sum(int(b) for b in s)
elif base == 8:
s = oct(abs(n))[2:]
return sum(int(o) for o in s)
elif base == 16:
s = hex(abs(n))[2:]
# каждая hex-цифра преобразуется в число
return sum(int(ch, 16) for ch in s)
else:
raise ValueError('Поддерживаются только основания 2,8,10,16')
print(digit_sum_base_system(255, 16)) # FF -> 15+15 = 30
print(digit_sum_base_system(255, 10)) # 2+5+5 = 12
print(digit_sum_base_system(255, 2)) # 11111111 -> 8
30 12 8
Как выполнить суммирование цифр с помощью однострочной лямбды?
Для компактного использования можно записать функцию в виде лямбды. Это удобно в функциональном стиле, но ухудшает читаемость.
digit_sum_lambda = lambda n: sum(int(d) for d in str(abs(n)))
print(digit_sum_lambda(1000000)) # 1
1
Как протестировать функцию на производительность при работе с большими числами?
Модуль timeit позволяет замерить время выполнения разных реализаций. Пример для числа с 10 000 цифрами.
import timeit
# создаём огромное число
big_num = int('9' * 10000)
def digit_sum_while(n):
total = 0
n = abs(n)
while n:
total += n % 10
n //= 10
return total
def digit_sum_str(n):
return sum(int(ch) for ch in str(abs(n)))
time_while = timeit.timeit(lambda: digit_sum_while(big_num), number=1000)
time_str = timeit.timeit(lambda: digit_sum_str(big_num), number=1000)
print(f'Цикл: {time_while:.4f} сек')
print(f'Строка: {time_str:.4f} сек')
Цикл: 0.0200 сек Строка: 0.0450 сек (примерные значения)
Циклический метод оказывается быстрее, так как не требует создания большого количества строковых объектов.
Как обработать случай, когда число представлено в виде списка цифр?
Если цифры уже разбиты, суммирование тривиально, но можно использовать встроенную функцию sum.
digits = [1, 2, 3, 4]
total = sum(digits)
print(total) # 10
10