Работа с цифрами числа и проверки делимости
Число — это не только величина, но и набор цифр; научимся вытаскивать их и работать с каждой.
Извлечение цифр — разбор числа на отдельные цифры с помощью остатка от деления на 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; палиндром проверяют «переворотом» числа.
- Разложение на множители: делим на наименьший делитель, пока делится, до корня из числа.
Закрепите практикой
Задачи с автоматической проверкой — решайте прямо здесь, не уходя из учебника.