Как анализировать и преобразовывать запись числа алгоритмом?
Число и его запись — разные объекты. Арифметический алгоритм получает цифры остатками от деления, строковый — читает символы и переводит их в значения. Выбор представления зависит от операции: для подсчёта цифр подходят оба пути, а сохранение ведущих нулей возможно только у строки.
Извлечение цифр
Для неотрицательного целого последняя цифра в основании p равна остатку от деления на p, после чего число заменяется целой частью частного. Цифры появляются справа налево. Ноль обрабатывают отдельно, иначе цикл с условием n > 0 не выполнит ни одного шага.
Построение значения по строке
Схема Горнера обновляет накопитель правилом value = value · p + digit. Перед шагом накопитель равен значению уже прочитанного префикса; это удобный инвариант корректности. Каждый символ нужно проверить: его цифра обязана быть меньше основания.
Преобразование записи
Если алгоритм дописывает биты по чётности количества единиц, полезно отслеживать не всё число, а только необходимое свойство — parity. Дописывание справа эквивалентно умножению текущего значения на основание и прибавлению новой цифры. Так строковые правила переводятся в арифметические ограничения.
Ведущие нули и знак
Записи 0012 и 12 обозначают одно число, но имеют разную длину. Если условие говорит о значащих разрядах, ведущие нули исключают; если речь о кодовом слове фиксированной длины, они могут быть обязательными. Знак не является цифрой и разбирается до основного прохода.
Обратная проверка
После преобразования вычислите результат двумя способами: по разрядам и обратным переводом. Для алгоритма над всеми записями небольшой длины можно перечислить пространство входов программно, но в объяснении следует вывести ограничение, например возможный остаток или диапазон. Это превращает перебор в проверяемое рассуждение.
Строка и число решают разные задачи
Если требуется сохранить ведущие нули, запись нужно обрабатывать как строку. Если важны арифметические свойства цифр натурального числа, подходит повторное divmod. Алгоритм ниже строит запись для основания до 36 и явно проверяет диапазон.
DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def encode(number: int, base: int) -> str:
if number < 0 or not 2 <= base <= len(DIGITS):
raise ValueError("unsupported value")
if number == 0:
return "0"
result = ""
while number:
number, digit = divmod(number, base)
result = DIGITS[digit] + result
return result
assert encode(2026, 16) == "7EA"Добавление символа в начало строки может давать квадратичную стоимость для очень длинной записи; список цифр с последующим reverse масштабируется лучше. На экзамене важно назвать структуру данных и оценку, а не только получить верные символы.
Практика: зеркальная запись и сумма цифр
Для положительного n найдите сумму цифр, число цифр и число с обратным порядком десятичных разрядов без преобразования в строку. Зафиксируйте поведение для n = 0 и чисел, оканчивающихся нулями. Затем реализуйте декодирование строки в основании 2…36 и протестируйте свойство decode(encode(n, p), p) = n на ста разных n и нескольких основаниях. Отдельно объясните, почему encode(decode(text, p), p) может удалить ведущие нули.
Источники
- МФТИ: Программа вступительного испытания по информатике и информационно-коммуникационным технологиям.
- МФТИ: Пример вступительного испытания по информатике.
- МФТИ: Вступительные испытания в 2026 году.
- Семакин И.Г., Хеннер Е.К., Шеина Т.Ю. Информатика. 11 класс. Базовый уровень.