ЕГЭ · Информатика · Алгоритмы и исполнители
Задание 5: подбор исходного числа
Решать прямую и обратную задачу про алгоритм построения числа R.
🎯 ЕГЭ информатика: этот урок закрывает задание(я) 5.
- ⚠Ищут наибольшее/наименьшее не то число, что просят в условии
- ⚠Забывают проверить все ветви условия в программе
Определение
Суть задания 5 — алгоритм по числу N строит число R. Спрашивают минимальное/максимальное N с заданным условием на R.
Надёжная стратегия перебора
• Напиши функцию R(N), точно повторяющую шаги условия.
• Перевод в двоичную: bin(N)[2:], обратно: int(s,2); конкатенация — работа со строками.
• Перебери N в разумном диапазоне циклом, для каждого посчитай R.
• Выбери первое подходящее в нужном направлении.
Ловушка: внимательно читай — минимальное или максимальное N, «не меньше» или «больше». Неверное направление цикла (range вперёд/назад) теряет балл чаще самой логики.
Разбор примера
Каркас решения задания 5 на Python
Показать типовой скелет решения задания 5: функция R(N) повторяет шаги условия, а цикл перебирает N и берёт первое подходящее.
Показать решение по шагам
- 1.
def R(N): s = bin(N)[2:] # двоичная запись без '0b' if N % 3 == 0: s = s + '00' # правило условия для чисел, кратных 3 else: s = s + '11' # правило для всех остальных return int(s, 2) # полученную запись читаем как двоичное число # перебираем N по возрастанию и берём первое подходящее for N in range(1, 1000): if R(N) >= 200: print(N) break
Ответ: Цикл печатает минимальное N, при котором R(N) ≥ 200
Задание 5: почему его решают «задом наперёд»
В задании 5 дан алгоритм, который по введённому числу строит новое число, и требуется найти наименьшее (или наибольшее) исходное число, при котором результат удовлетворяет условию.
Прямой путь — перебирать все числа подряд и прогонять алгоритм — работает, но медленно и ненадёжно: на экзамене нет компьютера, а границы перебора часто велики.
Правильный путь опирается на устройство таких алгоритмов. Почти всегда алгоритм делает одно и то же: переводит число в двоичную систему, что-то дописывает к записи и переводит обратно. А значит, результат однозначно определяется двоичной записью исходного числа, и рассуждать нужно о ней, а не о самом числе.
Общая схема решения.
Шаг 1. Прочитать алгоритм как правило для двоичной записи. Типичные формулировки: «если число чётное, дописать справа 0, иначе дописать 1», «подсчитать сумму цифр и дописать её остаток от деления на 2». Переведите словесное описание в одну фразу вида «к записи N дописываются такие-то биты».
Шаг 2. Записать результат формулой. Дописать бит справа — значит умножить число на 2 и прибавить этот бит. Дописать два бита — умножить на 4 и прибавить двузначное двоичное число. Это ключ: длинное словесное описание превращается в короткое арифметическое выражение вида R = 4·N + c, где c зависит от свойств N.
Шаг 3. Подставить условие на результат и решить неравенство относительно N, разобрав случаи по значению c. Случаев обычно два-три: чётное и нечётное, либо остаток от деления на 4.
Шаг 4. Проверить найденное число прогоном алгоритма. Этот шаг обязателен: он занимает минуту и ловит ошибку в разборе случаев.
Шаг 5. Убедиться, что найдено именно крайнее значение. Если ищется наименьшее N, проверьте соседнее меньшее — оно должно условию не удовлетворять. Это самая частая потеря балла: найдено подходящее число, но не наименьшее.
Разбор примера
Задание 5: разбор с рассуждением о двоичной записи
Автомат получает на вход натуральное число N. По нему строится новое число R: двоичная запись N дополняется справа одним битом — нулём, если N чётное, и единицей, если N нечётное; затем к полученной записи слева не добавляется ничего, и результат переводится в десятичную систему. Найдите наименьшее N, при котором R больше 100.
Показать решение по шагам
- 1. Шаг 1. Переводим описание в формулу. Дописать бит справа — это умножить число на 2 и прибавить дописанный бит. Значит, R равно 2·N, если N чётное, и 2·N + 1, если N нечётное.
- 2. Шаг 2. Разбираем случай чётного N. Требуется 2·N больше 100, то есть N больше 50. Наименьшее чётное число, большее 50, — это 52. Проверка: для N = 52 получаем R = 104, условие выполнено.
- 3. Шаг 3. Разбираем случай нечётного N. Требуется 2·N + 1 больше 100, то есть 2·N больше 99, то есть N не меньше 50, а с учётом нечётности — N не меньше 51. Проверка: для N = 51 получаем R = 103, условие выполнено.
- 4. Шаг 4. Сравниваем кандидатов из двух случаев: 52 и 51. Наименьший — 51.
- 5. Шаг 5. Проверяем соседнее меньшее число, как требует последний шаг схемы. N = 50 чётное, R = 100, а условие требует больше 100 — не подходит. Значит, 51 действительно наименьшее.
- 6. Вывод о методе: разбор по случаям чётности обязателен, потому что формула для R в этих случаях разная, и «средний» ответ по одной из формул даёт ошибку.
Ответ: 51
Как устроено условие линии 5
Три пункта условия и что делать с каждым
Условие линии 5 всегда состоит из трёх пронумерованных пунктов и одного вопроса. Вот оно целиком, дословно из банка:
«На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Строится двоичная запись числа N.
2. Далее эта запись обрабатывается по правилу: если N кратно 3, в конец записи дописывается 00, иначе — 11.
3. Полученная запись переводится в десятичную систему счисления — это и есть число R.
Укажите минимальное число N, после обработки которого получается число R, не меньшее 64».
Пункт 1 задаёт систему счисления. Чаще всего двоичная, но бывает и троичная, и восьмеричная — читать надо внимательно, потому что от этого зависит вся арифметика.
Пункт 2 — само правило, и оно меняется от варианта к варианту. В банке встречаются: дописать цифры в конец, дописать в начало, вставить в середину, заменить две последние цифры, дописать по-разному в зависимости от чётности N, от кратности трём, от чётности числа единиц в записи.
Пункт 3 возвращает результат в десятичную систему.
Вопрос — это отдельная ловушка: минимальное или максимальное N, «не меньше» или «строго больше». Перепутать направление легко, и тогда верная программа даст неверный ответ.
Главный приём: дописать цифру — это умножить
Прежде чем писать программу, стоит заметить, что операции над записью числа — это обычная арифметика, и в такой форме задача часто решается устно.
Дописать цифру d справа в системе с основанием p — значит умножить число на p и прибавить d. В десятичной это очевидно: приписать к 47 семёрку — получить 477 = 47 · 10 + 7. В двоичной ровно так же: приписать 1 к числу N — получить 2N + 1.
Отсюда правила линии 5 переводятся в формулы:
— дописать в конец 00 — это 4N (два разряда, то есть умножение на 2², и ничего не прибавляем);
— дописать в конец 11 — это 4N + 3 (двоичное 11 это тройка);
— дописать 1 в конец — это 2N + 1, дописать 0 — это 2N;
— в троичной системе дописать цифру d справа — это 3N + d.
Дописать цифру слева так просто не выражается: приписать единицу к k-разрядной двоичной записи — значит прибавить 2k. Здесь придётся разбирать случаи по числу разрядов.
Вставить в середину — тоже разбор случаев, и его удобнее доверить программе.
Зачем это знать, если есть компьютер? Затем, что формула сразу показывает ответ без перебора. Правило «00 при кратности трём, иначе 11» даёт R = 4N для кратных трём и R = 4N + 3 для остальных. Условие R ≥ 64 превращается в два неравенства, и решаются они в уме.
Разбор примера
Линия 5: сначала рассуждением, потом программой
Если N кратно 3, в конец двоичной записи дописывается 00, иначе — 11. Укажите минимальное N, при котором R не меньше 64.
Показать решение по шагам
- 1. Шаг 1. Переводим правило в арифметику. Дописать 00 — умножить на 4: R = 4N для N, кратных трём. Дописать 11 — умножить на 4 и прибавить 3 (двоичное 11 равно 3): R = 4N + 3 для остальных.
- 2. Шаг 2. Разбираем первый случай. N кратно 3, нужно 4N ≥ 64, то есть N ≥ 16. Наименьшее кратное трём число, не меньшее 16, — это 18, и оно даёт R = 72.
- 3. Шаг 3. Разбираем второй случай. N не кратно 3, нужно 4N + 3 ≥ 64, то есть 4N ≥ 61, N ≥ 15,25, значит N ≥ 16. Число 16 не кратно трём — годится, и даёт R = 67.
- 4. Шаг 4. Сравниваем кандидатов: 18 и 16. Минимальное — 16.
- 5. Шаг 5. Проверяем соседа слева, чтобы убедиться в минимальности. N = 15 кратно трём, двоичная запись 1111, дописываем 00: 111100, это 60 — меньше 64, не подходит. Все N < 15 дают ещё меньшие R, потому что обе формулы монотонно растут.
- 6.
Шаг 6. Та же задача программой:
def R(N): s = bin(N)[2:] # двоичная запись без приставки '0b' if N % 3 == 0: s += '00' else: s += '11' return int(s, 2) # обратно в десятичнуюN = 1 while R(N) < 64: N += 1 print(N, R(N)) - 7. Шаг 7. Программа печатает 16 67. Обратите внимание на форму цикла:
whileс условием «пока не подходит» и увеличением N — это поиск минимального N. Для максимального цикл пишут наоборот, от большого значения вниз, и обязательно с ограничением, иначе он не остановится. - 8. Шаг 8. Почему стоит уметь оба способа. Программа надёжнее, когда правило сложное (вставка в середину, зависимость от числа единиц). Арифметика быстрее и показывает структуру ответа: видно, что кандидатов ровно два — по одному на каждую ветвь правила, — и это страхует от случая, когда цикл проскочил нужное число.
Ответ: 16
| дописать 00 в конец | s += '00', или арифметикой: R = 4N |
|---|---|
| дописать 11 в конец | s += '11', или R = 4N + 3 |
| дописать 1 в начало | s = '1' + s, то есть R = N + 2k, где k — число разрядов |
| две последние цифры заменить на 10 | s = s[:-2] + '10' |
| вставить 0 в середину | k = len(s); s = s[:k//2] + '0' + s[k//2:] |
| если N чётно / кратно 3 | if N % 2 == 0: / if N % 3 == 0: |
| если число единиц чётно | if s.count('1') % 2 == 0: |
| троичная запись вместо двоичной | своя функция перевода; дописать d справа — это 3N + d |
Разбор примера
Правило, которое руками не свернуть: вставка в середину
В середину двоичной записи числа N вставляется цифра 0: если в записи k цифр, она ставится после первых ⌊k/2⌋ цифр. Укажите минимальное N, при котором R не меньше 128.
Показать решение по шагам
- 1. Здесь арифметической формулы нет: результат зависит от длины записи, а она меняется скачками. Это ровно тот случай, когда программу писать быстрее, чем рассуждать.
- 2.
def R(N): s = bin(N)[2:] k = len(s) s = s[:k // 2] + '0' + s[k // 2:] return int(s, 2)N = 1 while R(N) < 128: N += 1 print(N, R(N)) - 3. Шаг 1.
k // 2— целочисленное деление, то есть та самая ⌊k/2⌋ из условия. При нечётном k правая половина оказывается длиннее на одну цифру, и это в точности поведение срезаs[:k//2]. - 4. Шаг 2. Программа печатает 64 128. Проверим руками: 64 в двоичной это 1000000, семь цифр. Вставляем ноль после первых трёх: 100 + 0 + 0000 = 10000000, то есть 128 ✔
- 5. Шаг 3. Проверяем соседа слева. N = 63 это 111111, шесть цифр; вставляем ноль после первых трёх: 1110111 = 119. Меньше 128 — значит, 64 действительно минимально.
- 6. Шаг 4. Обратите внимание на скачок: 63 даёт 119, а 64 — сразу 128. Причина в том, что у 64 на один двоичный разряд больше, и вставка сдвигает старшую часть ещё дальше влево. Именно из-за таких скачков перебор здесь надёжнее прикидки: монотонность у этого правила есть, но растёт результат неравномерно.
- 7. Шаг 5. Полезная привычка отладки — распечатать несколько соседних значений:
for N in range(60, 70): print(N, bin(N)[2:], R(N)). Видно и запись, и результат, и сразу ясно, не ошиблись ли в правиле вставки.
Ответ: 64
Разбор примера
Другой сюжет линии 5: четырёхзначное число и его цифры
Автомат получает на вход четырёхзначное число K. Вычисляется S — сумма всех цифр числа K, M — максимальная цифра, N — минимальная. Затем P1 = S − M, P2 = S − N. Результат R получается приписыванием P1 к P2 (сначала P2, потом P1), записанных подряд. Найти наибольшее K, при котором R = 2117.
Показать решение по шагам
- 1. Шаг 1. Этот сюжет устроен иначе: работают не с записью числа в другой системе, а с цифрами десятичной записи. Приём тот же — написать функцию R(K) буквально по пунктам условия.
- 2.
def R(K): c = [int(d) for d in str(K)] # цифры числа S = sum(c) M = max(c) N = min(c) P1 = S - M P2 = S - N return int(str(P2) + str(P1)) # приписывание = склейка строкotvet = None for K in range(1000, 10000): if R(K) == 2117: otvet = K # запоминаем каждое подходящее print(otvet) - 3. Шаг 2. Ключевая деталь: «приписывание» — это склейка строк, а не сложение.
str(P2) + str(P1)даёт «21» и «17» рядом, то есть 2117. Попытка посчитать P2 · 100 + P1 сработает только при двузначном P1 и сломается, если P1 окажется однозначным. - 4. Шаг 3. Почему цикл идёт вперёд и без
break. Ищем наибольшее K, а перебор удобнее вести по возрастанию — тогда последнее найденное и будет наибольшим. Альтернатива:range(9999, 999, -1)сbreakна первом же совпадении. Оба варианта верны, смешивать их нельзя: цикл вперёд сbreakдаст наименьшее K, а это другой ответ. - 5. Шаг 4. Диапазон перебора задан словом «четырёхзначное»: от 1000 до 9999. Девять тысяч итераций — мгновенно.
- 6. Шаг 5. Разберём, что вообще означает R = 2117. Приписывание даёт P2 = 21 и P1 = 17, откуда S − N = 21 и S − M = 17. Вычитая, получаем M − N = 4: разброс между наибольшей и наименьшей цифрой равен четырём. Дальше из S = 21 + N и S = 17 + M подбирается сумма цифр. Программа проделывает этот разбор автоматически, но понимание структуры помогает проверить, что ответ не случаен.
Ответ: Печатается наибольшее K, для которого R = 2117
Вопрос на проверку
В конец двоичной записи числа N дописали 11. Чему равно полученное число?
Ответить и проверить себя — после бесплатной регистрации.
Вопрос на проверку
Ищем наибольшее N. Какой цикл подойдёт?
Ответить и проверить себя — после бесплатной регистрации.
Ловушки линии 5
Минимальное или максимальное. Самая дорогая ошибка линии: программа верна, направление перебора нет. Подчеркните в условии слово «минимальное» или «наибольшее» прежде, чем писать цикл.
Нестрогое неравенство против строгого. «R не меньше 64» — это R ≥ 64, и число 64 подходит. «R больше 64» — это R > 64, и 64 уже не годится. Разница в один шаг перебора и в целый балл.
Система счисления в пункте 1. Если написано «троичная запись», то bin не годится: нужна своя функция перевода. Прочитать «двоичная» там, где написано «троичная», проще, чем кажется, — пункты выглядят одинаково из варианта в вариант.
Приписывание не равно сложению. В сюжетах с цифрами «приписать P1 к P2» — это склейка строк. Арифметическая формула P2 · 100 + P1 сработает не всегда.
Диапазон перебора. «Четырёхзначное число» — это 1000…9999, а не 1…9999. И наоборот, для сюжетов с двоичной записью верхнюю границу приходится прикидывать: если R растёт примерно вчетверо, для R ≈ 1000 хватит N до 300.
Проверка соседа. Найдя ответ, посчитайте R для соседнего числа в «запрещённую» сторону. Если оно тоже подходит, значит, минимум найден не тот.
Что унести из урока
Линия 5 — это алгоритм из трёх пунктов и вопрос про крайнее значение исходного числа. Решается она двумя способами, и оба полезны.
Программой. Написать функцию R(N), дословно повторяющую пункты условия, и перебрать N в разумном диапазоне. Направление цикла определяется словом «минимальное» или «наибольшее»: вверх с прерыванием на первом совпадении — для минимума, вверх без прерывания с запоминанием — для максимума.
Арифметикой. Операции над записью — это умножение и сложение: дописать d справа в системе с основанием p значит умножить на p и прибавить d. Дописать 00 в двоичной — это 4N, дописать 11 — это 4N + 3. Правило с условием («если кратно 3») даёт две формулы, каждая решается неравенством, и из двух кандидатов берётся нужный.
Второй способ не только быстрее — он показывает, что кандидатов ровно столько, сколько ветвей в правиле, и потому страхует от промаха перебора.
Полезные строчки Python для этой линии: bin(N)[2:] — двоичная запись без приставки, int(s, 2) — обратно в число, s[:k//2] + '0' + s[k//2:] — вставка в середину, s.count('1') — число единиц, [int(d) for d in str(K)] — цифры десятичного числа.
Задание №5 в формате экзамена
Ответить и проверить себя — после бесплатной регистрации.
Задание №5 в формате экзамена
Ответить и проверить себя — после бесплатной регистрации.
Задание №5 в формате экзамена
Ответить и проверить себя — после бесплатной регистрации.