Задание №14. Системы счисления: огромные числа и неизвестные цифры
Что от тебя хотят
В условии либо огромное выражение вроде 7292021 − 2·272024 − 6561, у которого надо посчитать цифры в записи по какому-то основанию, либо запись числа с «дыркой»: 98897x21 в системе по основанию 19. Для «дырки» надо найти все x, при которых что-то выполняется (например, число делится на 18).
Два инструмента
| Задача | Инструмент |
|---|---|
| Из строки с цифрами в число | int("12A45", 19) |
| Из числа в запись по основанию | цикл: s = str(n % base) + s, затем n = n // base |
int(строка, основание) понимает любые основания от 2 до 36. Цифры выше 9 это буквы: A = 10, B = 11, и так далее. Поэтому для основания 19 последняя цифра это I (18).
Разбор 1: считаем цифры
Значение выражения 2·21872020 + 7292021 − 2·2432022 + 812023 − 2·272024 − 6561 записали в системе счисления с основанием 27. Сколько в этой записи цифр, числовое значение которых больше 9?
Первое окно считает значение и идёт по его цифрам в 27-ричной записи: остаток от деления на 27 это последняя цифра, целая часть от деления отрезает её. Строку собирать не нужно, цифры выше 9 строкой всё равно не записать, поэтому сразу сравниваем остаток с 9. Ответ: 3367. Это задача из демоверсии 2026 года.
Разбор 2: ищем цифру x
В системе счисления по основанию 19 заданы числа 98897x21 и 2x923, где x это ненулевая цифра. Найдите наибольшее x, при котором сумма чисел делится на 18, и укажите частное от деления этой суммы на 18.
Перебираем x от 1 до 18 (ноль запрещён условием). Для каждого собираем строку и переводим int(..., 19). Если сумма делится на 18, запоминаем частное: последнее запомненное будет для наибольшего x. Ответ 469034148, это задача из демоверсии 2025 года.
range(20) даст запись, которой не существует.
Разновидности и прототипы задания на экзамене
Код решения на Python
Запустить код в онлайн-песочницеvalue = 2 * 2187 ** 2020 + 729 ** 2021 - 2 * 243 ** 2022 + 81 ** 2023 - 2 * 27 ** 2024 - 6561
count = 0
while value > 0:
if value % 27 > 9:
count += 1
value = value // 27
print(count)
digits = "0123456789ABCDEFGHI"
for x in range(1, 19):
a = int("98897" + digits[x] + "21", 19)
b = int("2" + digits[x] + "923", 19)
total = a + b
if total % 18 == 0:
answer = total // 18
print(answer)
Типичные ошибки
range(base): от 0 до base - 1.s = str(value % base) + s.digits[x] или отдать всё int(строка, основание).ГРОБ №14: Две неизвестные цифры
В записи числа две дырки: x и y. Одним циклом их не перебрать.
for x in range(base): и внутри for y in range(base):. Для основания 19 это 361 вариант, мгновенно.Лайфхаки на экзамене
int("12A45", 19)работает для любых оснований от 2 до 36. Для оснований больше 10 цифры-буквы пиши заглавными.- Для основания, равного степени двойки (2, 4, 8, 16), цифры можно получить прямо из двоичной записи, но проще перевести циклом.
- Если нужно «наименьшее x», останавливайся на первом подходящем (
break). Если «наибольшее», просто не останавливайся и запоминай последнее.