Очередной вопрос с собеседования на роль джуниора в ИТ-компании на находчивость и умение написать простой код:
Напишите код, который проверяет, счастливое это число или нет.
Когда такое спрашивают, то хотят проверить, как быстро вы сообразите, что нужно сделать и как это будет выглядеть в коде. Представьте, что вы уже на собеседовании, и попробуйте решить задачку за 15 минут.
В математике счастливым числом называют такое число, у которого, если постоянно возводить в квадрат и складывать все цифры числа и так раз за разом, в конце получится единица.
Например, число 19 — счастливое:
19 → 1² + 9² = 82
82 → 8² + 2² = 68
68 → 6² + 8² = 100
100 → 1² + 0² + 0² = 1
А число 20 — нет:
20 → 2² + 0² = 4
4 → 4² = 16
16 → 1² + 6² = 37
37 → 3² + 7² = 58
58 → 5² + 8² = 89
89 → 8² + 9² = 145
145 → 1² + 4² + 5² = 42
42 → 4² + 2² = 20, и всё начинается сначала
Для решения нам понадобятся две функции: одна будет возводить в квадрат и складывать все цифры в числе, а вторая будет делать это до тех пор, пока не получится единица. Начнём с квадратов.
Возводим цифры числа в квадрат
Логику сделаем такую:
- На старте сумма будет равна нулю.
- Пока в числе есть цифры — берём последнюю и возводим её в квадрат. Это можно сделать, взяв остаток от деления на 10.
- Значение квадрата добавляем к сумме.
- Убираем последнюю цифру числа, взяв целую часть от деления на 10, и повторяем всё до тех пор, пока есть что делить на 10.
- Как только начальное число станет равно нулю — останавливаемся и возвращаем результат.
Запишем это в виде кода на Python. Если что, вот статья, которая поможет на старте:
# считаем сумму квадратов цифр числа
def squared(n):
# на старте она равна нулю
result = 0
# пока есть цифры в числе
while n>0:
# получаем последнюю цифру
last = n%10
# возводим её в квадрат и прибавляем к сумме
result += last * last
# отбрасываем последнюю цифру
n = n//10
# выводим результат
print(result)
# возвращаем сумму
return result
# проверяем, как работает функция
print(squared(19))
Проверяем, счастливое число или нет
Теперь, когда мы умеем складывать квадраты цифр, можно проверить, счастливое число перед нами или нет. Для этого напишем вторую функцию — она вернёт True, если число окажется счастливым.
Смысл в том, что нам нужно постоянно возводить цифры в квадрат, складывать и перепроверять новое число снова. Так мы будем делать до тех пор, пока в сумме не получим единицу или пока не поймём, что мы зациклились. Чтобы это работало постоянно, организуем цикл, который остановится, когда сумма станет равна единице.
Ещё нам нужно сохранить стартовое число для проверки — зациклились мы или нет. Дело в том, что если мы на каком-то шаге получим число, с которого начинали, то это значит, что дальше цикл будет делать одно и то же по кругу. Чтобы этого избежать, добавим проверку, было такое число уже или нет:
# проверяем, счастливое ли число
def isHappy(n):
# запоминаем, с чего мы начали
start = n
# сумма на старте равна нулю
result = 0
# пока не получим единицу — выполняем цикл
while result != 1:
# получаем сумму квадратов цифр
result = squared(n)
# делаем её новым стартовым числом
n = result
# если сумма совпала с тем, что было — мы зациклились
if result == start:
print('Всё зациклилось')
# выходим из функции
return False
# если дошли сюда — число счастливое
return True
Запускаем код
Последний шаг — добавить тестовое число и запустить проверку:
# число для проверки
test = 20
# проверяем, счастливое ли число и выводим ответ
if isHappy(test):
print('Это счастливое число')
else:
print('Это не счастливое число')
Если хотите попрактиковаться в коде, напишите такой же алгоритм на JavaScript или предложите свой вариант программы в комментариях.