Разбор задачи: Счастливое число

Предложенный нами код решения:

def is_happy(n):
    """
    Определяет, является ли число n счастливым.
    
    :param n: Положительное целое число.
    :return: True, если число является счастливым, иначе False.
    """
    seen = set()
    while n != 1 and n not in seen:
        seen.add(n)
        n = sum(int(digit) ** 2 for digit in str(n))
    return n == 1

Логика работы функции

  1. Входные данные:
    • n: Положительное целое число.
  2. Идея алгоритма:
    • Счастливое число определяется последовательным вычислением суммы квадратов цифр числа.
    • Если на каком-то этапе результат становится равным 1, число считается счастливым.
    • Если вычисления зацикливаются (результат повторяется), число не является счастливым.
  3. Алгоритм работы:
    • Используется множество seen для отслеживания всех чисел, которые встречались в процессе вычислений, чтобы избежать бесконечного цикла.
    • Пока число n не равно 1 и не попало в множество seen:
      • Добавить n в множество seen.
      • Заменить n на сумму квадратов его цифр.
    • После завершения цикла проверяется, равно ли число n единице. Если да, возвращается True; иначе False.

Разбор кода

seen = set()
  • Создаётся пустое множество seen.
  • Оно используется для хранения всех ранее вычисленных значений n, чтобы отслеживать возможные циклы.

while n != 1 and n not in seen:
  • Цикл выполняется, пока:
    1. n не равно 1 (т.е. число ещё не признано счастливым).
    2. n отсутствует в seen (т.е. не обнаружен цикл).

seen.add(n)
  • Добавляет текущее значение n в множество seen, чтобы отслеживать уже обработанные числа.

n = sum(int(digit) ** 2 for digit in str(n))
  • Преобразует число n в строку для работы с его цифрами.
  • Для каждой цифры:
    1. Преобразует её обратно в целое число (int(digit)).
    2. Возводит в квадрат (int(digit) ** 2).
  • Суммирует квадраты всех цифр, заменяя исходное значение n.

return n == 1
  • Проверяет, равно ли текущее значение n единице.
  • Если равно, возвращается True, так как число считается счастливым.
  • Если цикл завершился из-за повторения числа в seen, возвращается False.

Пример работы функции

Пример 1: n = 19

  1. Исходное число: 19.
  2. Последовательность вычислений:
    • 12+92=1+81=821^2 + 9^2 = 1 + 81 = 8212+92=1+81=82
    • 82+22=64+4=688^2 + 2^2 = 64 + 4 = 6882+22=64+4=68
    • 62+82=36+64=1006^2 + 8^2 = 36 + 64 = 10062+82=36+64=100
    • 12+02+02=11^2 + 0^2 + 0^2 = 112+02+02=1
  3. Цикл завершается, так как n = 1.
  4. Возвращается True.

Пример 2: n = 4

  1. Исходное число: 4.
  2. Последовательность вычислений:
    • 42=164^2 = 1642=16
    • 12+62=1+36=371^2 + 6^2 = 1 + 36 = 3712+62=1+36=37
    • 32+72=9+49=583^2 + 7^2 = 9 + 49 = 5832+72=9+49=58
    • 52+82=25+64=895^2 + 8^2 = 25 + 64 = 8952+82=25+64=89
    • 82+92=64+81=1458^2 + 9^2 = 64 + 81 = 14582+92=64+81=145
    • 12+42+52=1+16+25=421^2 + 4^2 + 5^2 = 1 + 16 + 25 = 4212+42+52=1+16+25=42
    • 42+22=16+4=204^2 + 2^2 = 16 + 4 = 2042+22=16+4=20
    • 22+02=42^2 + 0^2 = 422+02=4
  3. Обнаружен цикл: 4→16→37→58→89→145→42→20→44 \to 16 \to 37 \to 58 \to 89 \to 145 \to 42 \to 20 \to 44→16→37→58→89→145→42→20→4.
  4. Возвращается False.

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии