Задание 14: позиционные системы счисления
Задание 14 (повышенный уровень): арифметика и записи чисел в разных основаниях.
Позиционная система счисления с основанием b представляет число суммой разрядов: каждая цифра умножается на степень основания, соответствующую её позиции.
Как устроена позиционная запись
В системе с основанием b запись dn...d1d0 означает число dn·bn + ... + d1·b1 + d0·b0. Например, восьмеричное 3258 = 3·64 + 2·8 + 5 = 213. Цифры всегда меньше основания: в восьмеричной системе бывают только 0–7.
В Python переводы делаются встроенными средствами, что превращает большинство задач 14 в одну-две строки:
# встроенные функции перевода
print("0o325 =", int("325", 8)) # из 8-ричной в десятичную
print("bin(213) =", bin(213)) # в двоичную (с префиксом 0b)
print("oct(213) =", oct(213)) # в восьмеричную
print("hex(213) =", hex(213)) # в шестнадцатеричную
print("int('1A',16) =", int("1A", 16)) # из 16-ричной
Вывод:
0o325 = 213
bin(213) = 0b11010101
oct(213) = 0o325
hex(213) = 0xd5
int('1A',16) = 26
Универсальный перевод в любое основание
Встроенные функции работают для оснований 2, 8, 16. Для произвольного основания (5, 6, 7, …) напишем свою функцию — пригодится постоянно:
def to_base(n, base):
if n == 0:
return "0"
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
res = ""
while n > 0:
res = digits[n % base] + res
n //= base
return res
print("100 в 5-ричной:", to_base(100, 5))
print("100 в 6-ричной:", to_base(100, 6))
print("100 в 7-ричной:", to_base(100, 7))
Вывод:
100 в 5-ричной: 400 100 в 6-ричной: 244 100 в 7-ричной: 202
Тип 1: вычислить выражение и посчитать цифры
Очень частая формулировка: «Значение выражения 87 + 45 − 2 записали в двоичной системе. Сколько единиц в записи?» Считать руками здесь — гарантированная ошибка. Программой это тривиально:
val = 8**7 + 4**5 - 2
binary = bin(val)[2:] # отбрасываем префикс '0b'
print("значение:", val)
print("двоичная запись:", binary)
print("единиц:", binary.count("1"))
print("нулей:", binary.count("0"))
Вывод:
значение: 2098174 двоичная запись: 1000000000001111111110 единиц: 10 нулей: 12
Идея метода: 8 = 23, 4 = 22, поэтому 87 = 221, 45 = 210 — это «единица и нули» в двоичной записи. Но даже не зная этого приёма, программа даёт точный ответ.
Тип 2: найти основание системы
Другая разновидность: «В системе счисления с некоторым основанием десятичное число 71 записывается как трёхзначное и оканчивается на 1. Найти основание (если оно однозначно).» Перебираем основания и проверяем условия:
def to_digits(n, base):
d = []
while n > 0:
d.append(n % base)
n //= base
return d[::-1]
target = 71
for base in range(2, 30):
d = to_digits(target, base)
# трёхзначное И последняя цифра 1
if len(d) == 3 and d[-1] == 1:
print("основание", base, "-> запись", d)
Вывод:
основание 5 -> запись [2, 4, 1] основание 7 -> запись [1, 3, 1]
Здесь подходящих оснований два (5 и 7). Если в задании добавлено уточняющее условие (например, «сумма цифр равна 7»), оно отсекает лишнее: 2+4+1 = 7, а 1+3+1 = 5, значит ответ — 5. Программа позволяет мгновенно перебрать и проверить любое дополнительное условие.
Тип 3: сравнение и арифметика в разных системах
Если просят сложить два числа в восьмеричной системе или сравнить числа в разных основаниях — переводите всё в десятичную, считайте, при необходимости возвращайте в нужную систему:
# Сложить 157(8) и 264(8), результат записать в 8-ричной
a = int("157", 8)
b = int("264", 8)
s = a + b
print("157(8) =", a, " 264(8) =", b)
print("сумма (10):", s, "-> (8):", oct(s)[2:])
Вывод:
157(8) = 111 264(8) = 180 сумма (10): 291 -> (8): 443
Тип 4: количество чисел с условием на запись
Распространённая формулировка: «Сколько существует натуральных чисел x, для которых запись x в системе с основанием 4 содержит ровно 3 разряда и оканчивается на 2?» Это снова перебор: проходим все x в подходящем диапазоне и проверяем условие на их записи.
def to_base(n, base):
if n == 0:
return "0"
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
res = ""
while n > 0:
res = digits[n % base] + res
n //= base
return res
count = 0
for x in range(1, 1000):
s = to_base(x, 4)
if len(s) == 3 and s[-1] == "2":
count += 1
print("таких чисел:", count)
Вывод:
таких чисел: 12
Проверка логики: трёхзначные числа в четверичной системе — это диапазон от 1004=16 до 3334=63. Старший разряд — 3 варианта (1, 2, 3), средний — 4 варианта (0–3), младший фиксирован (2). Итого 3·4·1 = 12. Перебор подтверждает арифметику — и страхует от ошибки в подсчёте вариантов.
Сравнение быстрых эквивалентностей
Полезно держать в голове связки между «соседними» основаниями. Поскольку 8 = 23 и 16 = 24, перевод между двоичной, восьмеричной и шестнадцатеричной системами делается «триадами» и «тетрадами» — группами по 3 или 4 двоичных разряда. Это объясняет, почему многие задания 14 решаются устно, если заметить степень двойки в основании. Но даже зная теорию, на КЕГЭ надёжнее перепроверить ответ кодом — секунда работы против риска потерять балл.
Типичные ловушки
- Префиксы в Python:
bin()возвращает строку с0b,oct()— с0o. Отбрасывайте префикс срезом[2:]перед подсчётом цифр. - Цифра меньше основания. В пятеричной системе нет цифры 5 — это частая ловушка в заданиях «возможна ли такая запись».
- Не одно, а несколько оснований. Читайте уточняющие условия — иногда ответов несколько, и нужно выбрать по дополнительному критерию.
- Степени двойки. Многие задачи решаются устно, если заметить, что 4, 8, 16 — степени двойки.
Итог
- Перевод между системами в Python:
int(s, base)в десятичную,bin/oct/hexи свояto_base— обратно. - «Сколько единиц/нулей» — вычислите выражение и посчитайте символы в нужной записи.
- «Найти основание» — переберите основания и проверьте все условия задачи.