Задание 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 — обратно.
  • «Сколько единиц/нулей» — вычислите выражение и посчитайте символы в нужной записи.
  • «Найти основание» — переберите основания и проверьте все условия задачи.
Проверьте себя
1. Чему равно восьмеричное число 325 в десятичной системе?
A185
B213
C325
D200
2. Сколько единиц в двоичной записи числа 8 в степени 7 (то есть 2 в степени 21)?
A0
B1
C7
D21
3. В системе с основанием 5 какая запись НЕвозможна?
A402
B143
C350
D451
Поддержать проект