Как решать задание 5 ЕГЭ на Python
Есть исходное число N. Алгоритм меняет его двоичную или троичную запись и получает новое число R. Программа повторяет эти действия для каждого N, оставляет подходящие результаты и выбирает ответ.
N→ запись числа →s→ изменение записи →int(s, основание)→RВ шпаргалке разобраны три варианта. Начнём с вопроса задачи: он определяет последние строки программы.
| Что требуется | Что сохраняем | Как выбираем |
|---|---|---|
| Максимальное исходное N | mas.append(n) | max(mas) |
| Минимальное исходное N | mas.append(n) | min(mas) |
| Минимальное полученное R | mas.append(r) | min(mas) |
if r <= 19:, затем mas.append(n). Числа n и r здесь выполняют разные роли.Команды, которые нужны в этих трёх типах
| Фраза в условии | Строка Python | Пример |
|---|---|---|
| Построить двоичную запись N | s = bin(n)[2:] | 12 → 1100; [2:] убирает 0b из результата bin |
| Сумма двоичных цифр чётная | s.count('1') % 2 == 0 | В 1100 две единицы, сумма чётная |
| N делится на 3 | n % 3 == 0 | 12 % 3 = 0 |
| Взять последние три цифры | s[-3:] | Из 1100 получаем 100 |
| Взять последние две цифры | s[-2:] | Из 120 получаем 20 |
| Оставить запись с третьего символа | s[2:] | Из 11001 получаем 001 |
| Дописать справа | s = s + хвост | Строки 1100 и 100 дают 1100100 |
| Получить десятичное R | r = 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. Проверяем чётность исходной записи
В двоичной системе сумма цифр равна числу единиц. Поэтому проверка из условия записывается 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 = 12 | N = 4 |
|---|---|---|
| Исходная запись | 1100 | 100 |
| Количество единиц | 2 — чётное | 1 — нечётное |
| Дописали бит справа | 11000 | 1001 |
| Заменили первые два разряда | 10000 | 1101 |
| Перевели в десятичную | R = 16 | R = 13 |
| Проверили R ≤ 19 | Да, сохраняем n = 12 | Да, сохраняем n = 4 |
4. Собираем полный перебор
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? |
|---|---|---|
| 6 | 8 | Да |
| 7 | 15 | Да |
| 8 | 25 | Нет |
| 9 | 18 | Да |
| 12 | 16 | Да |
| 13 | 27 | Нет |
Как связаны эти строки с короткой записью из шпаргалки?
Для исходной записи длиной хотя бы 2 бита строка '10' + s[2:] + '0' сразу выполняет обе операции чётной ветви. Аналогично работает '11' + s[2:] + '1' для нечётной.
В полном решении выше операции разделены и повторяют порядок условия. Это учитывает N = 1: сначала 1 → 11, затем замена первых двух разрядов оставляет 11, то есть R = 3. Короткая запись из исходной строки дала бы 111. На максимальный ответ 12 эта разница не влияет.
Дописываем последние цифры или запись остатка
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 % 3 | 2 |
| Умножить остаток на 3 | 2 × 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).
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))| N | R | R ≥ 200? |
|---|---|---|
| 24 | 192 | Нет |
| 25 | 103 | Нет |
| 26 | 214 | Да |
| 27 | 219 | Да |
| 28 | 115 | Нет |
| 29 | 238 | Да |
Почему в шпаргалке стоит r > 200?
В этом конкретном алгоритме R = 200 не получается, поэтому оба сравнения дают ответ 26. Но фразу «не меньше» переводим именно как >=, чтобы верно решать и другие условия.
Тот же перебор в системе с основанием 3
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 | Новая строка s | n после n //= 3 |
|---|---|---|---|
| 15 | 0 | 0 | 5 |
| 5 | 2 | 20 | 1 |
| 1 | 1 | 120 | 0 |
Функция вернула 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, делится на 3 | N = 5, остаток 2 |
|---|---|---|
| Исходная троичная запись | 120 | 12 |
| Хвост | Последние две цифры: 20 | 2 × 5 = 10; to_3(10) = 101 |
| Новая запись | 12020 | 12101 |
| Десятичное R | 141 | 145 |
| R > 133? | Да | Да |
4. Перебираем все N и сохраняем R
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))r и выбираем минимум после перебора.| N | Полученное R | Проходит R > 133? |
|---|---|---|
| 5 | 145 | Да |
| 8 | 226 | Да |
| 11 | 307 | Да |
| 12 | 111 | Нет |
| 13 | 122 | Нет |
| 14 | 388 | Да |
| 15 | 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.
Все шаги для этого N
| Действие | Результат |
|---|
В поле N доступны целые числа от 1 до 1 000 000. Здесь прослеживается один кандидат. Ответ задачи выбирается после нужного перебора всех N.
Собери три программы и проверь их вывод
В этих задачах изменены числовые границы. Заполни пропуски выражениями из разобранных шаблонов. Затем скопируй собранную программу в свой редактор Python, запусти и введи полученный ответ. Отдельные задания для написания с чистого листа есть в учебном архиве.
Кнопка «Проверить строки» сверяет фрагменты с разобранными шаблонами. Другой способ решения можно проверить запуском в Python и по итоговому ответу. Пробелы и вид обычных кавычек в полях не мешают проверке.
Решено: 0 из 12
Сборка 1. Максимальное 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⟧)Программа собрана. Запусти её в Python и проверь вывод ниже.
1. Какой ответ напечатала программа?
Максимальное N при R ≤ 35. Введи итоговое число.
Сборка 2. Минимальное 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⟧)Программа собрана. Запусти её в Python и проверь вывод ниже.
2. Какой ответ напечатала программа?
Минимальное N при R ≥ 300. Введи итоговое число.
Сборка 3. Минимальное 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⟧)Программа собрана. Запусти её в Python и проверь вывод ниже.
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Открой 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 ЕГЭ.