Top.Mail.Ru

Как переводить числа между системами счисления и решать задание №14 на Python

11 класс

Поделиться статьей:

Informatics

В этой статье вспомним переводы из различных систем счисления и научимся решать задание №14 из ЕГЭ по информатике.

Термины, которые будем использовать: система счисления.

Функции для перевода из 10 сс в Python

* Здесь и далее: сс — система счисления.

  1. bin() — переводит из 10 сс в 2 сс,
  2. oct() — переводит из 10 сс в 8 сс,
  3. 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 раскладывай число вручную;
  • внимательно читай условие — иногда ответ нужно искать перебором.

Практикуйся, и «системы счисления» станут твоим надёжным инструментом на экзамене. Удачи!

Забирай курсы подготовки к ОГЭ и ЕГЭ с жирной скидкой

В 100б ты пробьёшь свой
максимум на экзаменах

наши лучшие курсы

Выбери подходящий курс и предмет, чтобы прокачаться и сдать ОГЭ на «5», а ЕГЭ на 80+ баллов

Выбрать курс

бесплатные материалы

Курсы, вебы, чек-листы — всё за 0 ₽

Забрать за 0 ₽

Интенсив по поступлению

Запишись на интенсив по поступлению, чтобы
взять из ЕГЭ максимум и попасть в вуз мечты

Записаться
В 100балльном репетиторе ты пробьёшь свой максимум на экзаменах

Преимущества подготовки
в 100балльном

10+
лет средний опыт наших преподавателей

18
выпускников сдали ЕГЭ
на 200 из 200 в 2024 году

300k+
учеников поступили в вуз мечты с нашей помощью 

14%
стобалльников России — наши выпускники

2 347
выпускника сдали ЕГЭ на 100 баллов

Преимущества подготовки в 100балльном

Запишись
на бесплатный
вводный урок

Познакомим с преподавателями и платформой

Расскажем про учёбу

Поможем поставить цель

  • 11 класс
  • 10 класс
  • 9 класс
  • 8 класс
  • 7 класс
Запись на вводный урок

Список всех тем