В этой статье вспомним переводы из различных систем счисления и научимся решать задание №14 из ЕГЭ по информатике.
Термины, которые будем использовать: система счисления.
Функции для перевода из 10 сс в Python
* Здесь и далее: сс — система счисления.
- bin() — переводит из 10 сс в 2 сс,
- oct() — переводит из 10 сс в 8 сс,
- hex() — переводит из 10 сс в 16 сс.
! Важно !
Каждая из этих функций принимает число в 10 сс и возвращает строку.
print(bin(100)) #0b1100100
print(oct(100)) #0o144
print(hex(100)) #0x64
Все строки начинаются со специальных символов, которые обозначают, в какой сс записано число, поэтому чтобы вернуть само число, нужно от строки сделать срез со 2-го индекса и до конца.
print(bin(100)[2:])
print(oct(100)[2:])
print(hex(100)[2:])
Перевод из 10 сс в любую другую сс
Вспомним, как мы делаем перевод числа из 10 сс в любую другую:
На примере числа 101, мы постоянно делим его на 7, запоминая остатки (а последним числом оставшуюся целую часть). Сначала остаток будет равен 3, потом 0 и, наконец, целая часть 2. Однако после этого нам нужно записать числа в ОБРАТНОМ порядке, чтобы получить верное значение. Для этого воспользуемся или срезом [::–1], или изначально будем дописывать к итоговому числу в N системе счисления разряды слева (так получится сначала 3, после 03 и, наконец, верное число 203).
Напишем функцию в общем виде, которая принимает число и сс, в которую его нужно перевести:
def f(num, base):
res = ““
while num > 0:
res += str(num % base)
num //= base
return res[::-1]
print(f(101, 7)) #203
Аналогичный способ, в котором остатки от деления изначально записываются в начало строки, а не в конец:
def f(num, base):
res = ““
while num > 0:
res = str(num % base) + res
num //= base
return res
print(f(101, 7)) #203
Перевод из другой сс в 10 сс
int(number, base)
Функция int() принимает число в виде строки (которое нужно перевести в 10 сс), и вторым аргументом — основание, то есть сс, из которой мы переводим.
! Важно !
Функция int() принимает основания от 2 до 36 включительно.
Но что делать, если наша сс не попадает в этот диапазон?
Вспомним на примере перевода числа 1202 из троичной сс:
Расставим индексы справа налево:
3 2 1 0
1 2 0 2
Берём каждый разряд числа и умножаем его на основание сс, возведённое в степень нужного индекса:
1*3**3 + 2*3**2 + 0*3**1 + 2*3**0 = 27 + 18 + 0 + 2 = 47
Практикум: решение задач
Задание 1
Сколько цифр «9» содержится в десятичной записи числа $100^{20} − 10^{15} + 10$?
Вычислим значение выражения $100^{20} − 10^{15} + 10$, приведём его к строке и с помощью count() найдём кол-во “9“.
n = 100**20 − 10**15 + 10
print(str(n).count(«9»))
Задание 2
Значение арифметического выражения: $49^{7} + 7^{21} − 7$ – записали в системе счисления с основанием 7. Сколько цифр 6 содержится в этой записи?
Значение выражения $49^{7} + 7^{21} − 7$ вычисляется в 10 сс, значит необходимо вспомнить и написать функцию для перевода из 10 сс в 7 сс. После этого посчитать кол-во «6».
def to7(num):
res = ““
while num > 0:
res = str(num % 7) + res
num //= 7
return res
n = 49**7 + 7**21 – 7
print(to7(n).count(“6“))
Задание 3
Значение арифметического выражения:
$1331^{6500} − 55 \cdot 121^{610} + 77 \cdot 11^{510} − 3 \cdot 11^{100} − 221$
Записали в системе счисления с основанием 11. Определите количество цифр A в этой записи. Ответ запишите в десятичной системе.
Вспомним, что на самом деле в разных системах счисления после цифр 0-9 идут буквы A, B, C и т.д. Значит, на самом деле аналог буквы А это цифра 10, её и будем искать в остатках или записи числа в 11сс.
Вычислим значение выражения и в процессе перевода в 11 сс будем проверять, какой остаток получается на каждой итерации.
def to11(num):
res = 0 # счётчик для кол-ва букв А, то есть 10-ок
while num > 0:
if num % 11 == 10: # если остаток равен 10, значит это буква А — искомая
res += 1
num //= 11 # в любом случае нужно делить на 11, чтобы остатки менялись
return res
n = 1331**6500 – 55*121**610 + 77*11**510 – 3*11**100 – 221
print(to11(n))
Задание 4
Операнды арифметического выражения записаны в системе счисления с основанием 19:
$98x79731_{19} + 36x14_{19}$
В записи чисел переменной x обозначена неизвестная цифра из алфавита девятнадцатеричной системы счисления. Определите наименьшее значение x, при котором значение данного арифметического выражения кратно 18. Для найденного значения x вычислите частное от деления значения арифметического выражения на 18 и укажите его в ответе в десятичной системе счисления. Основание системы счисления в ответе указывать не нужно.
Напоминаем, что с помощью функции int() возможно перевести строчное число из многих систем счислений в 10сс. Поэтому воспользуемся этим здесь, на месте х в строчном числе запишем 0, будто этот разряд пустует. После же прибавим к получившемуся числу возможное значение этого разряда, записанного в 10сс.
Как это сделать? Допустим есть число 12х5 и необходимо перевести его из 19сс в 10сс:
Нумеруем разряды чисел с конца от 0 до последнего возможного.
После каждый из разрядов умножаем на систему счисления и возводим в определённую степень — её мы записали на шаге 1:
1*19**3 + 2*19**2 + х*19**1 + 5*19**0, значит разряд, на котором стоит х можно записать как х*19**1 в конкретном примере.
for x in range(19):
s1 = int(“98079731“, 19) + x*19**5
s2 = int(“36014“, 19) + x*19**2
if (s1 + s2) % 18 == 0:
print((s1 + s2) // 18)
break
Задание 5
Операнды арифметического выражения записаны в системах счисления с основаниями 25 и 11.
$7y23x5_{25} + 67x9y_{11}$
В записи чисел переменными x и y обозначены допустимые в данных системах счисления неизвестные цифры. Определите значения x, y, при которых значение данного арифметического выражения кратно 131. Для найденных значений x, y вычислите частное от деления значения арифметического выражения на 131 и укажите его в ответе в десятичной системе счисления. Основание системы счисления в ответе указывать не нужно.
В этот раз у нас 2 переменные, а значит нужно для каждой из них сделать свой перебор. Более того, у каждого числа в сумме своя сс, но заметим: раз оба числа присутствуют в обоих числах, то выше 10 ни х, ни у не могут быть (иначе условие, что второе число записано в 11сс будет нарушено). Значит, будет достаточно устроить переборы in range(11).
for x in range(11):
for y in range(11):
s1 = int(“702305“, 25) + y*25**4 + x*25
s2 = int(“67090“, 11) + x*11**2 + y
res = s1 + s2
if res % 131 == 0:
print(res // 131)
Задание 6
Операнды арифметического выражения записаны в системах счисления с основаниями x и 100.
$13152_{x} + 7x25_{100}$
В записи чисел переменной x обозначены основание системы счисления первого операнда и неизвестная цифра из алфавита 100-ричной системы счисления второго операнда. Определите, сколько существует значений x, при которых значение данного арифметического выражения кратно 11. В ответе укажите это количество в десятичной системе счисления.
В этом задании число х участвует как какой-то разряд в числе, записанном в 100сс. Значит больше 99 его значение быть не может, тогда начнём перебор.
k = 0
# наибольшая цифра в левом числе — 5, значит наименьшая сс — 6 сс
for x in range(6, 100):
# Функция int() принимает основания от 2 до 36 включительно, поэтому мы не можем её использовать здесь
s1 = x**4 + 3*x**3 + x**2 + 5*x + 2
s2 = 7*100**3 + x*100**2 + 2*100 + 5
res = s1 + s2
if res % 11 == 0:
k += 1
print(k)
Задание 7
Значение арифметического выражения $3^{100} − x$, где х — целое положительное число, не превышающее 2000, записали в троичной системе счисления. Определите наименьшее значение х, при котором в троичной записи числа, являющегося значением данного арифметического выражения, содержится ровно два нуля. В ответе запишите число в десятичной системе счисления.
for x in range(1, 2001):
n = 3**100 — x
# переводим в 3 сс
n3 = «»
while n > 0:
n3 = str(n % 3) + n3
n //= 3
# проверяем кол-во 0 в числе 3 сс
if n3.count(«0») == 2:
print(x)
break
Заключение
Теперь ты сможешь решать задание №14 любой сложности — главное, помнить:
- при переводе из 10-й системы используй деление с остатком;
- при переводе в 10-ю систему используй степень основания или int();
- для оснований больше 36 раскладывай число вручную;
- внимательно читай условие — иногда ответ нужно искать перебором.
Практикуйся, и «системы счисления» станут твоим надёжным инструментом на экзамене. Удачи!