Числа Армстронга и палиндромы
Числа, которые «любуются собой»: одни равны сумме степеней своих цифр, другие читаются одинаково слева и справа.
Число Армстронга (нарциссическое) — число, равное сумме своих цифр, возведённых в степень, равную количеству цифр.
Эти диковинки касаются не делителей, а самих цифр в десятичной записи. Они показывают, как много красоты прячется в обычной позиционной системе счисления.
Числа Армстронга
Для $k$-значного числа правило таково: возведём каждую цифру в степень $k$ и сложим. Если получится исходное число — оно нарциссическое:
$$\overline{d_1 d_2 \ldots d_k} = d_1^k + d_2^k + \ldots + d_k^k.$$
Знаменитый пример — $153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153$. Среди трёхзначных таких ровно четыре. Найдём их и заодно проверим палиндромы.
def armstrong(n):
digits = str(n)
k = len(digits)
return sum(int(d) ** k for d in digits) == n
arm = [n for n in range(100, 1000) if armstrong(n)]
print("Трёхзначные числа Армстронга:", arm)
def is_palindrome(n):
s = str(n)
return s == s[::-1]
pals = [n for n in range(100, 200) if is_palindrome(n)]
print("Палиндромы от 100 до 200:", pals)
Вывод:
Трёхзначные числа Армстронга: [153, 370, 371, 407] Палиндромы от 100 до 200: [101, 111, 121, 131, 141, 151, 161, 171, 181, 191]
Палиндромы и алгоритм «перевернуть и сложить»
Число-палиндром читается одинаково в обе стороны: 121, 1331, 12321. С палиндромами связана красивая нерешённая задача: возьмите число, прибавьте к нему его же, записанное наоборот, и повторяйте. Многие числа быстро становятся палиндромами, но про число 196 неизвестно, станет ли оно когда-нибудь палиндромом (его называют числом Лишрел).
def reverse_and_add(n):
steps = 0
while str(n) != str(n)[::-1]:
n = n + int(str(n)[::-1])
steps += 1
return n, steps
for start in [57, 89, 132]:
result, steps = reverse_and_add(start)
print(f"{start}: палиндром {result} за {steps} шагов")
Вывод:
57: палиндром 363 за 2 шагов 89: палиндром 8813200023188 за 24 шагов 132: палиндром 363 за 1 шагов
Как работает под капотом
Трюк с проверкой палиндрома s == s[::-1] использует «срез наоборот»: [::-1] переворачивает строку. Для чисел Армстронга мы строкой получаем цифры, возводим в нужную степень и сравниваем. Обратите внимание на число 89: оно становится палиндромом лишь за 24 шага, дорастая до тринадцатизначного 8813200023188 — поэтому «перевернуть и сложить» иногда требует терпения. А вот 196 не сошлось даже за миллиарды итераций.
Частые ошибки
Для чисел Армстронга степень — это число цифр, а не всегда 3: для четырёхзначных возводят в четвёртую степень. Не путайте нарциссические числа с совершенными — у них совсем разные правила. И помните, что «перевернуть и сложить» сходится не всегда (число 196) — задача открыта.
Итог
- Число Армстронга равно сумме своих цифр в степени числа цифр.
- Трёхзначные: 153, 370, 371, 407.
- Палиндром читается одинаково в обе стороны.
- «Перевернуть и сложить» обычно даёт палиндром, но для 196 это не доказано.