Решение задания №5 ЕГЭ по информатике на Python — пошаговый разбор
В задании №5 числа переводятся в двоичную систему и обратно. В Python для этого есть две встроенные функции:
Функция bin(N) возвращает строку с префиксом '0b', например '0b10100'.
Если вы не обрежете [2:], а потом допишете что-то справа (например, + '11'), то 0b останется в её начале:
N = 20
S = bin(N) # '0b10100'
R = S + '11' # '0b1010011'
print(int(R,2)) # 83 N = 20
S = bin(N) # '0b10100'
R = '11' + S # '110b10100' ← 0b внутри строки!
print(int(R, 2)) # ValueError: invalid literal for int() with base 2 Возьмем конкретное задание из варианта ЕГЭ:
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
1. Строится двоичная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
а) если число N делится на 5, то к этой записи дописывается справа две единицы;
б) если число N на 5 не делится, то результат целочисленного деления N на 5 переводится в двоичную систему счисления и дописывается в конец числа.
3. Полученная таким образом запись является двоичной записью искомого числа R.
4. Результат переводится в десятичную систему и выводится на экран.
Например, для исходного числа 20 = 101002 результатом является число 10100112 = 83, а для исходного числа 14 = 11102 результатом является число 1110102 = 58.
Укажите минимальное чётное число N, для которого с помощью описанного алгоритма получается число, превышающее 896.
Прежде чем писать цикл перебора, убедимся, что код работает на примерах из условия.
Пример 1: N = 20
N = 20
S = bin(N)[2:]
if N % 5 == 0:
R = S + '11'
else:
R = S + bin(N // 5)[2:]
print(N, S, R, int(R, 2)) Совпадает с условием: 10100112 = 83 ✅
Пример 2: N = 14
N = 14
S = bin(N)[2:]
if N % 5 == 0:
R = S + '11'
else:
R = S + bin(N // 5)[2:]
print(N, S, R, int(R, 2)) Совпадает с условием: 111010₂ = 58 ✅
Можно объединить это в цикле:
for N in (20, 14):
S = bin(N)[2:]
if N % 5 == 0:
R = S + '11'
else:
R = S + bin(N // 5)[2:]
print(N, S, R, int(R, 2)) Вывод:
20 10100 1010011 83
14 1110 111010 58
for N in range(2, 1000, 2):
S = bin(N)[2:]
if N % 5 == 0:
R = S + '11'
else:
R = S + bin(N // 5)[2:]
if int(R, 2) > 896:
print(N)
break Результат: 56
Шаг 1. Цикл перебора
for N in range(2, 1000, 2): S = bin(N)[2:] if N % 5 == 0:
R = S + '11'
else:
R = S + bin(N // 5)[2:] if int(R, 2) > 896:
print(N)
break В этой задаче мы взяли range(2, 1000, 2). Откуда взялось 1000?
Вместо точных вычислений просто возьмём диапазон с большим запасом. Нам нужно получить число R > 896. Если взять N = 250, результат уже будет больше 1000 (потому что в самом худшем варианте мы допишем всего два бита в конце). А если взять N = 1000 — точно хватит.
Поэтому в цикле мы пишем range(2, 1000, 2) — это гарантирует, что мы точно найдём ответ.
Пример 1: Дописываем биты по-другому
Если число N делится на 3, то к двоичной записи дописывается '0', иначе — '1'.
for N in range(1, 1000):
S = bin(N)[2:]
if N % 3 == 0:
R = S + '0'
else:
R = S + '1'
if int(R, 2) > 100:
print(N)
break for N in range(1, 1000):
S = bin(N)[2:]
if N % 2 == 0:
R = '1' + S
else:
R = '0' + S
if int(R, 2) > 100:
print(N)
break for N in range(1, 1000):
S = bin(N)[2:]
R = S + bin(N % 3)[2:]
if int(R, 2) > 100:
print(N)
break Задание №5 можно решить на Python всего за 5–10 строк кода. Это:
Алгоритм решения любого задания №5:
И не забывайте отрезать префикс [2:] — это убережёт вас от ошибок, если в условии потребуется дописывать биты слева!
Я — Олег Алексеевич, репетитор по информатике. Готовлю к ЕГЭ более 15 лет.
На своих занятиях мы:
Хотите попробовать? Запишитесь на первое занятие — познакомимся, определим ваш уровень и составим план подготовки.
Переходите на мой сайт, чтобы узнать подробности и записаться: Репетиторы рядом