Главная › ЕГЭ по информатике › Задание 5
ЕГЭ по информатике · задание №5

Задание 5 ЕГЭ: от условия к решению на Python

Три алгоритма из шпаргалки: заменяем биты, дописываем хвост и работаем с троичной записью. Разбираем нужные строки, прослеживаем числа и собираем свои программы.

План решения

Как решать задание 5 ЕГЭ на Python

Есть исходное число N. Алгоритм меняет его двоичную или троичную запись и получает новое число R. Программа повторяет эти действия для каждого N, оставляет подходящие результаты и выбирает ответ.

N→ запись числа →s→ изменение записи →int(s, основание)→R

В шпаргалке разобраны три варианта. Начнём с вопроса задачи: он определяет последние строки программы.

Что требуетсяЧто сохраняемКак выбираем
Максимальное исходное Nmas.append(n)max(mas)
Минимальное исходное Nmas.append(n)min(mas)
Минимальное полученное Rmas.append(r)min(mas)
Условие проверяем по R, а ответом может быть NНапример, фраза «найдите максимальное N, для которого R не превышает 19» даёт if r <= 19:, затем mas.append(n). Числа n и r здесь выполняют разные роли.
Из условия в код

Команды, которые нужны в этих трёх типах

Фраза в условииСтрока PythonПример
Построить двоичную запись Ns = bin(n)[2:]12 → 1100; [2:] убирает 0b из результата bin
Сумма двоичных цифр чётнаяs.count('1') % 2 == 0В 1100 две единицы, сумма чётная
N делится на 3n % 3 == 012 % 3 = 0
Взять последние три цифрыs[-3:]Из 1100 получаем 100
Взять последние две цифрыs[-2:]Из 120 получаем 20
Оставить запись с третьего символаs[2:]Из 11001 получаем 001
Дописать справаs = s + хвостСтроки 1100 и 100 дают 1100100
Получить десятичное Rr = int(s, 2) или int(s, 3)Основание совпадает с системой итоговой записи

s[2:] и s[-2:] берут разные части строки. Первое отбрасывает два символа слева; второе оставляет два символа справа. Если в строке 11 взять s[-3:], Python вернёт всю строку 11, без добавления ведущих нулей.

Общий каркас перебора

mas = []
for n in range(1, 1000):
    s = bin(n)[2:]
    # Здесь меняем s строго по условию
    r = int(s, 2)
    # Здесь проверяем R и сохраняем нужное число
# Здесь выбираем ответ после всего перебора

s создаём заново для каждого n. Преобразование записи и проверка R находятся внутри цикла. Итоговый print располагается после цикла, без отступа. range(1, 1000) проверяет N от 1 до 999; почему этого хватает именно в этих примерах, разберём после трёх решений.

Разбор 1 · двоичная запись

Сумма цифр и замена двух первых разрядов

Построй двоичную запись натурального N. Если сумма её цифр чётная, допиши справа 0, затем замени два левых разряда на 10. Если сумма нечётная, допиши справа 1, затем замени два левых разряда на 11. Получившуюся запись переведи в десятичное R. Найди максимальное N, для которого R не превышает 19.

1. Проверяем чётность исходной записи

В двоичной системе сумма цифр равна числу единиц. Поэтому проверка из условия записывается s.count('1') % 2 == 0. Проверяем её до изменения s.

2. Выполняем изменения в нужном порядке

if s.count('1') % 2 == 0:
    s = s + '0'
    s = '10' + s[2:]
else:
    s = s + '1'
    s = '11' + s[2:]

После дописывания s[2:] берёт всё, что осталось правее первых двух символов. Приписываем слева 10 или 11 — так меняем два первых разряда, сохраняя остальную запись.

3. Прослеживаем одно N

ШагN = 12N = 4
Исходная запись1100100
Количество единиц2 — чётное1 — нечётное
Дописали бит справа110001001
Заменили первые два разряда100001101
Перевели в десятичнуюR = 16R = 13
Проверили R ≤ 19Да, сохраняем n = 12Да, сохраняем n = 4

4. Собираем полный перебор

Тип 1 · готовая программа
mas = []
for n in range(1, 1000):
    s = bin(n)[2:]
    if s.count('1') % 2 == 0:
        s = s + '0'
        s = '10' + s[2:]
    else:
        s = s + '1'
        s = '11' + s[2:]
    r = int(s, 2)
    if r <= 19:
        mas.append(n)
print(max(mas))

Строка r = int(s, 2) превращает изменённую запись в число. Ограничение r <= 19 проверяет результат, а mas.append(n) сохраняет исходное N. Затем max(mas) выбирает наибольшее из всех подходящих N.

NПолученное RСохраняем N?
68Да
715Да
825Нет
918Да
1216Да
1327Нет
Ответ: 12Для N = 12 получается R = 16. Ответом служит 12, потому что спрашивается исходное число.
Как связаны эти строки с короткой записью из шпаргалки?

Для исходной записи длиной хотя бы 2 бита строка '10' + s[2:] + '0' сразу выполняет обе операции чётной ветви. Аналогично работает '11' + s[2:] + '1' для нечётной.

В полном решении выше операции разделены и повторяют порядок условия. Это учитывает N = 1: сначала 1 → 11, затем замена первых двух разрядов оставляет 11, то есть R = 3. Короткая запись из исходной строки дала бы 111. На максимальный ответ 12 эта разница не влияет.

Разбор 2 · двоичный хвост

Дописываем последние цифры или запись остатка

Построй двоичную запись N. Если N делится на 3, допиши справа её последние три цифры. Иначе умножь остаток N % 3 на 3, переведи полученное число в двоичную запись и допиши её справа. Переведи итог в десятичное R. Найди минимальное N, для которого R не меньше 200.

1. Разделяем два правила

УсловиеКак получить хвостКак дописать
n % 3 == 0Взять s[-3:]s = s + s[-3:]
n % 3 != 0Вычислить число (n % 3) * 3, затем bin(...)[2:]s = s + bin((n % 3) * 3)[2:]

Проверяем делимость самого N, поэтому здесь n % 3. Количество единиц в записи больше не требуется.

2. Разбираем длинную строку по действиям

ДействиеДля N = 26
Исходная двоичная запись11010
Остаток n % 32
Умножить остаток на 32 × 3 = 6
Перевести 6 в двоичную запись110
Дописать этот хвост к исходной записи11010 + 110 = 11010110
Перевести результат в десятичную системуR = 214

Если остаток равен 1, хвостом станет двоичная запись числа 3 — 11. Если остаток 2 — запись числа 6, то есть 110. Запись str((n % 3) * 3) не подходит: она даст десятичную цифру 3 или 6 вместо двоичной строки.

Для делящейся ветви возьми N = 12: 1100 + 100 = 1100100, поэтому R = 100. Хвост берётся из записи до изменения s.

3. Переводим вопрос задачи в последние строки

«Не меньше 200» означает R ≥ 200. В коде используем r >= 200. Минимальное N означает сохранение n и выбор min(mas).

Тип 2 · готовая программа
mas = []
for n in range(1, 1000):
    s = bin(n)[2:]
    if n % 3 == 0:
        s = s + s[-3:]
    else:
        s = s + bin((n % 3) * 3)[2:]
    r = int(s, 2)
    if r >= 200:
        mas.append(n)
print(min(mas))
NRR ≥ 200?
24192Нет
25103Нет
26214Да
27219Да
28115Нет
29238Да
Ответ: 26Все N от 1 до 25 не подходят. При N = 26 впервые выполняется R ≥ 200; получаем R = 214.
Почему в шпаргалке стоит r > 200?

В этом конкретном алгоритме R = 200 не получается, поэтому оба сравнения дают ответ 26. Но фразу «не меньше» переводим именно как >=, чтобы верно решать и другие условия.

Разбор 3 · троичная запись

Тот же перебор в системе с основанием 3

Построй троичную запись N. Если N делится на 3, допиши справа её последние две цифры. Иначе умножь остаток N % 3 на 5, переведи результат в троичную запись и допиши её справа. Переведи итог в десятичное R. Найди минимальное получаемое R, строго большее 133.

1. Получаем троичную запись

Используем функцию из шпаргалки. Она возвращает строку, которую можно дополнять теми же приёмами:

Перевод положительного числа в троичную запись
def to_3(n):
    s = ''
    while n != 0:
        s = str(n % 3) + s
        n //= 3
    return s

Проследим to_3(15). Остаток от деления на 3 — очередная цифра. Добавляем её слева к уже собранной строке, затем делим число нацело на 3.

n внутри функцииn % 3Новая строка sn после n //= 3
15005
52201
111200

Функция вернула 120. Исходный n во внешнем цикле остался 15: деление меняло локальное число внутри функции. В этих примерах все вызовы to_3 получают положительные числа.

2. Меняем только нужные части второго шаблона

Было в двоичном типеСтало в троичном типе
bin(n)[2:]to_3(n)
s[-3:]s[-2:]
bin((n % 3) * 3)[2:]to_3((n % 3) * 5)
int(s, 2)int(s, 3)
Сохраняли nСохраняем r: теперь спрашивают минимум R

3. Проверяем две ветви вручную

ДействиеN = 15, делится на 3N = 5, остаток 2
Исходная троичная запись12012
ХвостПоследние две цифры: 202 × 5 = 10; to_3(10) = 101
Новая запись1202012101
Десятичное R141145
R > 133?ДаДа

4. Перебираем все N и сохраняем R

Тип 3 · готовая программа с функцией перевода
def to_3(n):
    s = ''
    while n != 0:
        s = str(n % 3) + s
        n //= 3
    return s

mas = []
for n in range(1, 1000):
    s = to_3(n)
    if n % 3 == 0:
        s = s + s[-2:]
    else:
        s = s + to_3((n % 3) * 5)
    r = int(s, 3)
    if r > 133:
        mas.append(r)
print(min(mas))
Первое подходящее N не даёт минимальное RПри N = 5 получаем R = 145. Если сразу остановиться, получится неверный ответ. Позже N = 15 даст меньшее R = 141. Поэтому сохраняем r и выбираем минимум после перебора.
NПолученное RПроходит R > 133?
5145Да
8226Да
11307Да
12111Нет
13122Нет
14388Да
15141Да
Ответ: 141Это минимальное R среди всех подходящих результатов. Число 15 — исходное N, которое его даёт; в ответ здесь записываем 141.
Осмысленный перебор

Почему здесь хватает range(1, 1000)

Число 1000 в шпаргалке — граница этих примеров. Для нового алгоритма её нужно проверять, особенно если ищешь максимальное N или минимальное R.

ПримерПочему ответ не потеряется
Тип 1: максимум N, R ≤ 19После дописывания и замены первых битов R > N. Значит при R ≤ 19 исходное N меньше 19. Диапазон до 999 включает все нужные N.
Тип 2: минимум N, R ≥ 200Перебираем N по возрастанию с 1. Уже N = 26 подходит, а все меньшие N проверены. Большие N не могут уменьшить ответ N.
Тип 3: минимум R > 133Здесь запись N только удлиняется справа, поэтому R ≥ N. В переборе найдено R = 141. Для любого пропущенного N ≥ 1000 получится R ≥ 1000, что уже больше 141.

В первом типе при исходной длине k ≥ 2 получается k + 1 бит с единицей слева, поэтому R ≥ 2k > N. Для N = 1 отдельно получается R = 3. В третьем типе дописывание непустого хвоста увеличивает положительное число.

Когда можно использовать break

Если N идут по возрастанию и требуется минимальное N, первое подходящее N уже является ответом. Это работает во втором типе. Если требуется минимальное R, значение R может уменьшиться при увеличении N, как в третьем типе. Останавливаться на первом подходящем N нельзя.

Повторный запуск с увеличенным диапазоном полезен для поиска ошибки, но сам по себе не доказывает, что ещё дальше нет лучшего ответа. Сначала выясни, как исходное N ограничивает возможное R.

Посмотри, как меняется запись

Пошагово выполни алгоритм для одного N

Выбери тип и N, затем переходи по шагам. На каждом шаге видно действие из Python, новую запись и проверку условия. Попробуй тип 1 с N = 12 и 4, тип 2 с N = 26 и 12, тип 3 с N = 15 и 5.

Теперь напиши сам

Собери три программы и проверь их вывод

В этих задачах изменены числовые границы. Заполни пропуски выражениями из разобранных шаблонов. Затем скопируй собранную программу в свой редактор Python, запусти и введи полученный ответ. Отдельные задания для написания с чистого листа есть в учебном архиве.

Кнопка «Проверить строки» сверяет фрагменты с разобранными шаблонами. Другой способ решения можно проверить запуском в Python и по итоговому ответу. Пробелы и вид обычных кавычек в полях не мешают проверке.

Решено: 0 из 12

Сборка 1. Максимальное N при R ≤ 35

Повтори алгоритм типа 1: по чётности суммы исходных двоичных цифр допиши справа 0 или 1, затем замени первые два разряда на 10 или 11 соответственно. Найди максимальное N, для которого R не превышает 35.
mas = []
for n in range(1, 1000):
    s = ⟦1⟧
    if ⟦2⟧:
        s = s + '0'
        s = '10' + s[2:]
    else:
        s = s + '1'
        s = '11' + s[2:]
    r = ⟦3⟧
    if ⟦4⟧:
        mas.append(⟦5⟧)
print(⟦6⟧)

1. Какой ответ напечатала программа?

Максимальное N при R ≤ 35. Введи итоговое число.

Сборка 2. Минимальное N при R ≥ 300

Алгоритм типа 2: если N делится на 3, допиши последние три двоичные цифры. Иначе допиши двоичную запись числа (N % 3) * 3. Найди минимальное N, для которого R не меньше 300.
mas = []
for n in range(1, 1000):
    s = bin(n)[2:]
    if n % 3 == 0:
        s = s + ⟦1⟧
    else:
        s = s + ⟦2⟧
    r = ⟦3⟧
    if ⟦4⟧:
        mas.append(⟦5⟧)
print(⟦6⟧)

2. Какой ответ напечатала программа?

Минимальное N при R ≥ 300. Введи итоговое число.

Сборка 3. Минимальное R, большее 300

Алгоритм типа 3: запись троичная. Если N делится на 3, допиши последние две троичные цифры. Иначе допиши троичную запись числа (N % 3) * 5. Найди минимальное получаемое R, строго большее 300.
def to_3(n):
    s = ''
    while n != 0:
        s = str(n % 3) + s
        n //= 3
    return s

mas = []
for n in range(1, 1000):
    s = ⟦1⟧
    if n % 3 == 0:
        s = s + ⟦2⟧
    else:
        s = s + ⟦3⟧
    r = ⟦4⟧
    if r > 300:
        mas.append(⟦5⟧)
print(⟦6⟧)

3. Какой ответ напечатала программа?

Минимальное R, большее 300. Введи итоговое число.

Короткие задания на понимание кода

Попробуй ответить без запуска. Если ошибся, можно изменить ответ и проверить снова.

4. Не перепутай срезы

Пусть s = '11001'. Какую строку даст s[2:]? Сохрани начальные нули.

5. Хвост исходной записи

При s = '11001' чему равно s[-3:]?

6. Чётность исходных цифр

В первом алгоритме для N = 12 какое R получится?

7. Хвост остатка

N = 26 во втором типе. Какую двоичную строку дописывает выражение bin((n % 3) * 3)[2:]?

8. Ветвь без остатка

Во втором алгоритме N = 12. Какое R получится после дописывания трёх последних двоичных цифр?

9. Выбираем число для списка

В троичном примере спрашивают минимальное полученное R. Что должно стоять внутри mas.append(...): n или r?

10. Первое подходящее N

Для троичного типа N = 5 даёт R = 145, а N = 15 даёт R = 141. Можно ли остановиться на первом подходящем N, если требуется минимальное R? Ответь «да» или «нет».

11. Правильное основание

Итоговая строка s получена в троичной системе. Какое число укажем вторым аргументом в int(s, ...)?

12. Ответ третьего разбора

Какое число выдаёт полный троичный пример с условием R > 133?

Практика в Python

Скачать программы и задания для самостоятельной работы

Три готовых разбора, три файла с условиями для написания с нуля и отдельная папка решений. Все программы запускаются без ввода данных и без дополнительных библиотек.

Скачать учебные файлы PythonОткрой 01_type1.py, 02_type2.py или 03_type3.py для повторения. Затем перейди в папку practice и напиши решение по условию. Сверку открывай после своей попытки.

В первом разборе операции выполнены в порядке исходного условия; во втором использовано точное сравнение «не меньше». Контрольные ответы трёх разборов: 12, 26, 141.

Видеоразбор

Видео по заданию №5

Видео скоро выйдет.

Как найти ошибку в решении

Что получилосьЧто проверить
Вместо числа R осталась длинная запись из цифрВыполнен ли перевод через int(s, 2) или int(s, 3)?
В двоичной строке появилась цифра 3 или 6Хвост нужно перевести через bin(...)[2:], а не через str(...).
Ответ из третьего примера равен 5 или 15Проверь mas.append(r): здесь спрашивают R.
Получилось 145 вместо 141Вероятно, перебор остановлен на первом подходящем N. Убери break и сравни все подходящие R.
На N = 12 первый тип попал в нечётную ветвьПроверяй сумму цифр исходной записи: s.count('1'), а не чётность самого n.
В списке оказалось слишком много или слишком мало кандидатовПроверь границы сравнения: больше — >, не меньше — >=, не превышает — <=.
После первого N остальные результаты странныеСтрока s должна создаваться заново внутри for, а отступы должны совпадать с шаблоном.

Для отладки временно добавь внутри цикла после вычисления r строку print(n, s, r). Сравни вывод для одного известного N с таблицей разбора. Когда преобразование совпало, убери диагностический вывод и оставь итоговый ответ.

Вопросы о решении задания 5 кодом

Нужно ли переводить исходное N в двоичную систему вручную?

Для программы используй bin(n)[2:]. Один-два примера полезно проверить вручную, чтобы убедиться, что запись изменяется по условию.

Почему считаем единицы, а не складываем все цифры?

В двоичной записи есть только 0 и 1, поэтому сумма цифр равна числу единиц. Для троичной записи это уже не одно и то же: цифра 2 внесёт в сумму два.

Почему to_3 добавляет цифру слева?

Остатки от деления получаются начиная с последней цифры числа. Поэтому каждый следующий остаток ставим перед уже собранной строкой: str(n % 3) + s.

Можно ли сразу поставить range(1, 1000000) для любой задачи?

Большой диапазон не гарантирует полный поиск для любого алгоритма. Посмотри на ограничения N в условии и на связь между N и R. Для трёх примеров достаточность выбранной границы объяснена выше.

Что делать, если min(mas) сообщает, что список пуст?

В выбранном диапазоне не найдено ни одного кандидата. Проверь сравнение, ветви и основание перевода. Для аккуратной диагностики можно сначала проверить if mas, а в else вывести сообщение об отсутствии чисел в этом диапазоне.

Где повторить сам Python?

Основы программирования и полный разбор задания 5 ЕГЭ доступны в учебнике. Здесь можно вернуться к нужному типу и ещё раз пройти путь от условия к коду.

Реши следующий пример самостоятельно

Возьми задания из учебного архива и напиши программу с чистого листа. Затем переходи к заданиям в практике. В учебнике можно повторить теорию и полный разбор задания 5 ЕГЭ.