Решение задач на 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

Примеры задач по Python с решениями - comments

En
задача примеры python (python)