Кристалл цифровой силы
Условие
В одной игре у героя есть «кристалл силы» с числом X. После каждого боя кристалл «сжимает» число: заменяет его на сумму его цифр. Если получившееся число всё ещё двузначное или больше — сжатие повторяется, пока не останется ровно одна цифра.
Твоя задача — узнать, какая цифра останется в кристалле.
Важно: X может быть до 10^18, то есть больше 32-битного типа (как на олимпиадах). В Python это не проблема.
Формат ввода
Одно целое число X.
Формат вывода
Одну цифру — итоговое число в кристалле после всех сжатий.
Ограничения
- 0 ≤ X ≤ 10^18
Пример
Ввод:
987654
Вывод:
3Как решать — идея подхода
Приём: Цифровой корень (остаток по 9)
Ключевое наблюдение: сколько бы раз ты ни заменял число на сумму его цифр, итоговая одна цифра называется цифровой корень. Он почти всегда равен остатку числа по 9 — потому что число и сумма его цифр дают один и тот же остаток при делении на 9 (из-за того, что 10 ≡ 1 (mod 9), значит 10^k ≡ 1).
Почему это работает здесь: вместо многократных «сжатий» (которые выглядят как цикл) можно сразу получить ответ за O(1), даже если X до 10^18.
План решения:
- Считай X.
- Если X == 0, ответ 0 (важный отдельный случай).
- Иначе посчитай
r = X % 9. - Если
r == 0, то цифровой корень равен 9 (это все числа кратные 9: 9, 18, 27, ...). - Иначе ответ равен
r.
Мини-сниппет формулы:
r = x % 9ans = 9 if r == 0 else r(но только когда x != 0)
Сложность: по времени O(1), по памяти O(1).
Частая ошибка: забыть про X = 0. Для нуля цифровой корень не 9, а 0, поэтому проверка x == 0 должна быть раньше правила про x % 9 == 0.
Разберись руками
Есть число 987654. Кристалл заменяет число на сумму его цифр, и так делает снова и снова, пока не останется одна цифра. Давай руками прогоним именно этот пример и посмотрим, что происходит.
- Посчитай сумму цифр числа 987654: 9+8+7+6+5+4 = ?
- Теперь «сожми» 39: 3+9 = ?
- Сожми 12: 1+2 = ? Это и будет финальная цифра.
- А теперь заметка для ускорения на больших числах: что НЕ меняется, когда ты заменяешь число на сумму его цифр (как мы сделали 987654 → 39 → 12 → 3)?
Идея: Можно честно «сжимать» число, пока не останется одна цифра. Если нужно быстро для очень больших чисел, полезно заметить, что при каждом сжатии сохраняется остаток при делении на 9, и по нему можно восстановить финальную цифру (а для нуля результат остаётся нулём).
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Вердикты судьи: WA, TLE, RE, PE, CE — что значит каждый код проверяющей системы и где искать причину
- Python на олимпиадах — где языка хватает с запасом, а где начинают значить лимиты — с замерами