Работа с цифрами числа и проверки делимости

Число — это не только величина, но и набор цифр; научимся вытаскивать их и работать с каждой.

Извлечение цифр — разбор числа на отдельные цифры с помощью остатка от деления на 10 и целочисленного деления на 10.

Зачем это нужно

Задачи «найдите сумму цифр», «сколько чётных цифр в числе», «является ли число палиндромом», «разложите на множители» встречаются в каждом сборнике и на ЕГЭ. За ними стоит один универсальный приём извлечения цифр, который работает в любой системе счисления. Освоив его, вы решаете целый класс задач по одному рецепту — и понимаете, почему он работает.

Обратите внимание, как тесно эта тема связана с самым первым разделом курса — системами счисления. Там мы переводили число в двоичную запись делением с остатком: остаток от деления на основание давал очередной разряд. Здесь происходит ровно то же самое, только основание равно 10. Это не совпадение, а одна и та же идея: любая цифра позиционной записи — это остаток от деления на основание, а отбрасывание этой цифры — целочисленное деление на основание. Поняв это однажды, вы получаете универсальный ключ: захотите работать с цифрами в десятичной системе — делите на 10, в двоичной — на 2, в шестнадцатеричной — на 16. Поэтому «работа с цифрами числа» — не отдельный фокус, а прямое продолжение того, что вы уже умеете. Дальше мы доведём этот приём до автоматизма и навесим на него типовые задачи.

Главный приём: остаток и целочисленное деление

Последняя цифра числа — это остаток от деления на 10 (n % 10). Чтобы «отрезать» её и перейти к остальным цифрам, делим нацело на 10 (n // 10). Повторяя, перебираем все цифры справа налево. Это работает потому, что в позиционной системе младший разряд — это и есть остаток от деления на основание:

n = 50327
digits = []
while n > 0:
    digit = n % 10          # последняя цифра
    digits.append(digit)
    n = n // 10             # отрезаем её
print("цифры справа налево:", digits)
print("в обычном порядке:", digits[::-1])

Вывод:

цифры справа налево: [7, 2, 3, 0, 5]
в обычном порядке: [5, 0, 3, 2, 7]

Сумма, количество и максимум цифр

Один проход по цифрам решает сразу несколько подзадач. Посчитаем сумму цифр, их количество, найдём наибольшую цифру и сосчитаем чётные:

number = 8473926
n = number
digit_sum = 0
count = 0
max_digit = 0
even_digits = 0
while n > 0:
    d = n % 10
    digit_sum += d
    count += 1
    if d > max_digit:
        max_digit = d
    if d % 2 == 0:
        even_digits += 1
    n //= 10

print("число:", number)
print("сумма цифр:", digit_sum)
print("количество цифр:", count)
print("наибольшая цифра:", max_digit)
print("чётных цифр:", even_digits)

Вывод:

число: 8473926
сумма цифр: 39
количество цифр: 7
наибольшая цифра: 9
чётных цифр: 4

Проверка делимости и признаки

Делимость проверяется остатком: n % k == 0 означает «n делится на k без остатка». Но есть и красивые признаки: число делится на 3, если сумма его цифр делится на 3. Проверим это правило на практике — оно экономит вычисления и часто спрашивается на ЕГЭ:

def digit_sum(n):
    s = 0
    n = abs(n)
    while n > 0:
        s += n % 10
        n //= 10
    return s

for x in (123, 124, 99999, 100):
    by_remainder = (x % 3 == 0)
    by_rule = (digit_sum(x) % 3 == 0)
    print(f"{x}: делится на 3? остаток={by_remainder}, признак={by_rule}")

Вывод:

123: делится на 3? остаток=True, признак=True
124: делится на 3? остаток=False, признак=False
99999: делится на 3? остаток=True, признак=True
100: делится на 3? остаток=False, признак=False

Число-палиндром

Палиндром читается одинаково слева направо и справа налево (121, 1331). Самый аккуратный способ проверки — «перевернуть» число тем же приёмом извлечения цифр и сравнить с исходным. Заодно это отличная тренировка накопителя:

def is_palindrome(number):
    n = number
    reversed_num = 0
    while n > 0:
        reversed_num = reversed_num * 10 + n % 10   # дописываем цифру
        n //= 10
    return reversed_num == number

for x in (121, 1331, 12321, 1234, 7):
    print(f"{x}: палиндром? {is_palindrome(x)}")

Вывод:

121: палиндром? True
1331: палиндром? True
12321: палиндром? True
1234: палиндром? False
7: палиндром? True

Разложение на простые множители

Любое натуральное число раскладывается в произведение простых. Алгоритм: делим на наименьший возможный делитель, пока делится, затем переходим к следующему. Это основа теории чисел и многих криптографических идей:

def factorize(n):
    factors = []
    d = 2
    while d * d <= n:
        while n % d == 0:        # делим, пока делится
            factors.append(d)
            n //= d
        d += 1
    if n > 1:                    # остался простой «хвост»
        factors.append(n)
    return factors

for x in (60, 97, 360, 1024):
    print(f"{x} = {factorize(x)}")

Вывод:

60 = [2, 2, 3, 5]
97 = [97]
360 = [2, 2, 2, 3, 3, 5]
1024 = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]

Попробуй сам

Соберём «паспорт числа»: для введённого числа выведем сумму и произведение цифр, есть ли среди них нули, и является ли оно палиндромом. Меняйте число и наблюдайте.

number = 40504

n = number
digit_sum = 0
digit_product = 1
has_zero = False
rev = 0
while n > 0:
    d = n % 10
    digit_sum += d
    digit_product *= d
    if d == 0:
        has_zero = True
    rev = rev * 10 + d
    n //= 10

print("число:", number)
print("сумма цифр:", digit_sum)
print("произведение цифр:", digit_product)
print("есть нули:", has_zero)
print("палиндром:", rev == number)

Вывод:

число: 40504
сумма цифр: 13
произведение цифр: 0
есть нули: True
палиндром: True

Частые ошибки

  • Путают % и //. Остаток % 10 даёт цифру, целочисленное деление // 10 её отрезает — обе операции нужны.
  • Используют обычное деление /. Оно даёт дробь и ломает цикл; для цифр нужно именно //.
  • Забывают про отрицательные числа и ноль. Берите abs(n), а случай n == 0 обрабатывайте отдельно (у него одна цифра — ноль).
  • Неверно стартуют произведение. Произведение цифр начинают с 1, а не с 0 (иначе всегда выйдет 0).

Итоги

  • Цифры извлекают парой операций: n % 10 (последняя цифра) и n // 10 (отрезать её).
  • Один проход по цифрам решает сумму, количество, максимум, чётность — одновременно.
  • Признак делимости на 3: сумма цифр делится на 3; палиндром проверяют «переворотом» числа.
  • Разложение на множители: делим на наименьший делитель, пока делится, до корня из числа.
Проверьте себя
1. Какая операция извлекает последнюю цифру целого числа n?
An // 10
Bn % 10
Cn / 10
Dn * 10
2. По какому признаку число делится на 3?
AЕсли оно оканчивается на 3, 6 или 9
BЕсли сумма его цифр делится на 3
CЕсли оно чётное
DЕсли последняя цифра делится на 3
3. С какого значения нужно начинать накопитель при подсчёте произведения цифр?
Aс 0
Bс 1
Cс 10
Dс самого числа

Закрепите практикой

Задачи с автоматической проверкой — решайте прямо здесь, не уходя из учебника.

Поддержать проект