← Назад к вопросам

Проверка числа Армстронга

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. Однозначные числа (1-9) — все числа Армстронга
  2. Не существует двузначных чисел Армстронга
  3. Всего известно 88 чисел Армстронга (в десятичной системе)
  4. Самое большое число Армстронга в десятичной системе: 24678050
  5. Это особый случай полиморфных чисел или Нарциисса

Эта задача демонстрирует:

  • Работу со строками и числами
  • Итерацию по цифрам
  • Применение степеней
  • Функциональный подход к решению задач
Проверка числа Армстронга | PrepBro