← Назад к вопросам
Проверка числа Армстронга
1.0 Junior🔥 101 комментариев
#Python Core#Другое
Условие
Напишите функцию, которая проверяет, является ли число числом Армстронга.
Число Армстронга — это натуральное число, которое равно сумме своих цифр, возведённых в степень, равную количеству его цифр.
Пример
153 = 1³ + 5³ + 3³ = 1 + 125 + 27 = 153 → True 371 = 3³ + 7³ + 1³ = 27 + 343 + 1 = 371 → True 123 → False
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Проверка числа Армстронга
Число Армстронга (также известное как число Нарциисса) — это натуральное число, которое равно сумме своих цифр, возведённых в степень, равную количеству его цифр.
Это интересная задача, которая демонстрирует работу со строками, числами и базовыми алгоритмами.
Решение
def is_armstrong_number(n: int) -> bool:
"""
Проверяет, является ли число числом Армстронга.
Args:
n: Число для проверки (должно быть положительным)
Returns:
True, если число Армстронга; False иначе
Examples:
>>> is_armstrong_number(153)
True
>>> is_armstrong_number(371)
True
>>> is_armstrong_number(123)
False
>>> is_armstrong_number(1)
True
"""
# Обработка отрицательных чисел
if n < 0:
return False
# Преобразуем число в строку, чтобы получить цифры
digits_str = str(n)
num_digits = len(digits_str)
# Вычисляем сумму цифр, возведённых в степень
armstrong_sum = sum(int(digit) ** num_digits for digit in digits_str)
# Проверяем, равна ли сумма исходному числу
return armstrong_sum == n
Примеры использования
# Примеры из задания
print(is_armstrong_number(153)) # True (1³ + 5³ + 3³ = 153)
print(is_armstrong_number(371)) # True (3³ + 7³ + 1³ = 371)
print(is_armstrong_number(123)) # False
# Другие числа Армстронга
print(is_armstrong_number(1)) # True (1¹ = 1)
print(is_armstrong_number(10)) # False
print(is_armstrong_number(1634)) # True (1⁴ + 6⁴ + 3⁴ + 4⁴ = 1634)
print(is_armstrong_number(8208)) # True (8⁴ + 2⁴ + 0⁴ + 8⁴ = 8208)
print(is_armstrong_number(9474)) # True (9⁴ + 4⁴ + 7⁴ + 4⁴ = 9474)
Расширенное решение с валидацией
from typing import Union
def is_armstrong_number_extended(n: Union[int, str]) -> bool:
"""
Расширенная версия с поддержкой строк и лучшей валидацией.
"""
# Преобразуем строку в число
if isinstance(n, str):
if not n.isdigit():
raise ValueError(f"Число должно содержать только цифры: {n}")
n = int(n)
# Проверяем, что это натуральное число
if not isinstance(n, int) or n < 0:
raise ValueError(f"Число должно быть натуральным: {n}")
# Вычисляем сумму
digits_str = str(n)
num_digits = len(digits_str)
armstrong_sum = sum(int(digit) ** num_digits for digit in digits_str)
return armstrong_sum == n
Оптимизированное решение (без строк)
def is_armstrong_number_optimized(n: int) -> bool:
"""
Версия без преобразования в строку (чуть более эффективна).
"""
if n < 0:
return False
# Подсчитываем количество цифр
num_digits = len(str(n)) # Или используем: math.floor(math.log10(n)) + 1 для n > 0
# Вычисляем сумму цифр в степени
armstrong_sum = 0
temp = n
while temp > 0:
digit = temp % 10 # Берём последнюю цифру
armstrong_sum += digit ** num_digits
temp //= 10 # Убираем последнюю цифру
return armstrong_sum == n
Нахождение всех чисел Армстронга до N
def find_armstrong_numbers(limit: int) -> list[int]:
"""
Находит все числа Армстронга до заданного предела.
"""
result = []
for n in range(limit):
if is_armstrong_number(n):
result.append(n)
return result
# Все числа Армстронга до 10000
armstrong_numbers = find_armstrong_numbers(10000)
print(armstrong_numbers) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474]
Тестирование
def test_is_armstrong_number():
# Однозначные числа (все числа Армстронга)
for i in range(10):
assert is_armstrong_number(i) == True
# Двузначные числа (нет чисел Армстронга)
for i in range(10, 100):
assert is_armstrong_number(i) == False
# Трёхзначные числа
assert is_armstrong_number(153) == True
assert is_armstrong_number(370) == True
assert is_armstrong_number(371) == True
assert is_armstrong_number(407) == True
assert is_armstrong_number(123) == False
assert is_armstrong_number(100) == False
# Четырёхзначные числа
assert is_armstrong_number(1634) == True
assert is_armstrong_number(8208) == True
assert is_armstrong_number(9474) == True
assert is_armstrong_number(1000) == False
# Граничные случаи
assert is_armstrong_number(0) == True
assert is_armstrong_number(-153) == False
print("Все тесты пройдены!")
test_is_armstrong_number()
Анализ сложности
- Временная сложность: O(k), где k — количество цифр в числе (обычно log₁₀(n))
- Пространственная сложность: O(1) (не считая входных данных)
Интересные факты
- Однозначные числа (1-9) — все числа Армстронга
- Не существует двузначных чисел Армстронга
- Всего известно 88 чисел Армстронга (в десятичной системе)
- Самое большое число Армстронга в десятичной системе: 24678050
- Это особый случай полиморфных чисел или Нарциисса
Эта задача демонстрирует:
- Работу со строками и числами
- Итерацию по цифрам
- Применение степеней
- Функциональный подход к решению задач