Двоичные алгоритмы в ЕГЭ: дописывание битов и решение на Python
Здесь разбираем алгоритмы, которые превращают число N в двоичную строку, меняют её и получают новое число R. Меняйте исходное число в схеме, сравнивайте две ветви алгоритма и проверяйте решение на Python.
Сразу к самопроверкеЧисло N и его двоичная запись — разные вещи
Число 6 записывается как 110 в двоичной системе. Когда справа дописывают 01, получается строка 11001. Её десятичное значение — 25. Это не сложение 6 и 1.
Если перевод пока вызывает трудности, начните с разрядов двоичной системы.
ПОПРОБУЙТЕ ДРУГОЕ ЧИСЛО
- Исходная запись110
- Чётное N: дописываем 01 справа11001
- Десятичное R25
Сначала предположите ответ. Затем меняйте N и проверяйте себя. Без JavaScript выше показан готовый пример для N = 6.
Условие учебного алгоритма
Авторский пример: натуральное число N находится в диапазоне от 1 до 100 включительно. Алгоритм строит R:
- Записывает N в двоичной системе без ведущих нулей.
- Если исходное N чётное, дописывает справа
01. - Если исходное N нечётное, дописывает слева
1, а справа0. - Переводит новую запись в десятичную систему.
Чётность проверяем у исходного числа N. В других задачах могут спрашивать чётность числа единиц или сумму цифр: это другое условие.
Два примера по шагам
| Шаг | N = 6, чётное | N = 5, нечётное |
|---|---|---|
| Двоичная запись | 110 | 101 |
| Преобразование | 110 + 01 | 1 + 101 + 0 |
| Новая запись | 11001 | 11010 |
| Десятичное R | 16 + 8 + 1 = 25 | 16 + 8 + 2 = 26 |
Знак «+» во второй строке означает соединение строк. Заметьте: большее N здесь даёт меньшее R. Значения R не обязаны возрастать вместе с N.
Как записать преобразование на Python
def transform(n):
s = bin(n)[2:]
if n % 2 == 0:
s = s + "01"
else:
s = "1" + s + "0"
return int(s, 2)
print(transform(6)) # 25
print(transform(5)) # 26bin(n)возвращает строку с префиксом0b; для положительного N срез[2:]оставляет цифры.n % 2 == 0проверяет чётность числа.int(s, 2)читает строку как двоичную запись.
Код можно проверить в Python онлайн. Сначала посчитайте два примера вручную.
Минимальное N и минимальное R: не перепутайте
Для нашего диапазона 1 ≤ N ≤ 100 найдём наименьшее R, которое больше 55. На N = 13 получаем R = 58, а на N = 14 — R = 57. Поэтому остановиться на первом подходящем N нельзя.
results = []
for n in range(1, 101):
r = transform(n)
if r > 55:
results.append((r, n))
if results:
r, n = min(results)
print(r) # 57
print(n) # 14Кортежи начинаются с R, поэтому min сначала сравнивает результаты. Если спросили наименьшее N, ответ для этого условия — 13. Если нужно R, ответ — 57.
Диапазон 1–100 здесь дан в условии. В другой задаче нельзя выбирать границу перебора наугад: её нужно взять из условия или обосновать.
Быстрая проверка без программы
Дописывание двух бит справа сдвигает исходное число на два разряда: умножает его на 4. Биты 01 добавляют 1. Для чётного N в нашем примере R = 4N + 1.
Для нечётного N пусть k — длина двоичной записи. Добавленная единица слева даёт 2k+1, а ноль справа умножает исходное N на 2. Получаем R = 2k+1 + 2N. При N = 5: k = 3, R = 16 + 10 = 26.
Это формулы именно для нашего правила. Если суффикс или префикс изменились, расчёт тоже меняется.
Ошибки, которые стоит проверить перед ответом
- Не оставлен ли префикс
0bвнутри изменённой записи? - Проверяется чётность N или количество единиц — как написано в условии?
- Биты дописываются с правильной стороны?
- В условии «больше» или «не меньше»?
- Спрашивают N или R? Есть ли обоснование диапазона перебора?
Правила bin и int: официальная документация Python. Формат экзамена сверяйте с материалами ФИПИ для нужного года. Примеры на этой странице авторские, не официальный вариант экзамена.
Проверьте себя
Сначала решите самостоятельно. Затем проверьте ответ или откройте объяснение.
Ответ и объяснение
9. 10 → 1001₂ = 9.
Ответ и объяснение
14. 11 → 1110₂ = 14.
Ответ и объяснение
41. 1010 → 101001₂ = 41.
Ответ и объяснение
13. При N = 13 результат 58. Для N от 1 до 12 подходящих результатов нет.
Ответ и объяснение
57. Результат 57 получается при N = 14. Первое подходящее N = 13 даёт большее R = 58.
Ответ и объяснение
38. 9 × 4 + 2 = 38; 1001 → 100110₂. Это отдельное правило из вопроса.