Перевод в произвольную систему счисления
Почему нужна своя функция
bin, oct и hex покрывают только основания 2, 8 и 16. А в заданиях 14 и 16 постоянно встречаются системы с основанием 3, 5, 6, 7. Готовой функции для них нет — перевод пишут вручную, через остаток и целочисленное деление.
Как работает алгоритм
Делим число на основание, остатки записываем — и читаем их в обратном порядке. Переведём 25 в троичную систему:
| Шаг | Число | Остаток от деления на 3 |
|---|---|---|
| 1 | 25 | 1 |
| 2 | 8 | 2 |
| 3 | 2 | 2 |
Остатки снизу вверх: 2 2 1, то есть 25 = 221₃. Проверка: 2·9 + 2·3 + 1 = 25.
Готовая функция
Эту функцию имеет смысл выучить наизусть — она нужна почти в каждом задании 14:
1 2 3 4 5 6 7 8 9 10 11 12
Две ключевые строки: n % b даёт очередной разряд, n //= b убирает его из числа. Строка собирается приписыванием слева — это и есть «чтение остатков в обратном порядке».
Если основание не больше 10, можно обойтись без строки digits:
1
Но с основанием 12 или 16 понадобятся буквы, поэтому универсальный вариант надёжнее.
Обратный перевод — уже готов
В обратную сторону писать ничего не нужно, int() умеет любое основание от 2 до 36:
1 2 3
Что обычно спрашивают
| Вопрос в условии | Код |
|---|---|
| сколько цифр в записи | len(to_base(n, b)) |
| сколько цифр «2» | to_base(n, b).count("2") |
| сумма цифр записи | sum(int(c) for c in to_base(n, b)) |
| на какую цифру заканчивается | n % b |
| первая цифра записи | to_base(n, b)[0] |
Пример с ЕГЭ: задание 14 — подсчёт цифр
Формулировка: «Значение арифметического выражения 9⁸ + 3⁵ − 9 записали в системе счисления с основанием 3. Сколько цифр 2 содержится в этой записи?»
1 2 3 4
Ответ — 3. Заметь, что Python работает с большими числами точно, поэтому 9⁸ можно не упрощать — записываем выражение ровно так, как оно дано в условии.
