Модуль: Вопрос 05. Анализ простых алгоритмов


Копирование и вычисление хвоста


Войдите на сайт, чтобы ответы сохранялись и баллы за тетрадь засчитывались.

Задача

На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:

1. Строится двоичная запись числа N.

2. К этой записи дописываются разряды по следующему правилу. Если число N кратно 3, то справа дописываются три последние цифры двоичной записи; иначе остаток от деления числа N на 3 умножается на 3, переводится в двоичную систему и записывается в конец двоичной записи.

3. Полученная таким образом запись является двоичной записью искомого числа R.

Например, для числа 12 двоичная запись 1100₂ преобразуется в запись 1100100₂ = 100, для числа 4 двоичная запись 100₂ преобразуется в 10011₂ = 19. Укажите максимальное возможное значение R, меньшее 170, которое может быть получено с помощью этого алгоритма. В ответе запишите это число в десятичной системе счисления.


Решение

Остаток 1 даёт хвост 11; остаток 2 — хвост 110; кратность 3 — копию трёх последних цифр. Хвост 111 можно попытаться снять как два бита 11 или как копию из трёх бит.


Выполни алгоритм для N = 10. Найди R.


Решение с конца: проверяем возможные хвосты
Ищем максимальное R < 170, которое действительно может получиться по алгоритму. Проверяем результаты сверху вниз. Для каждого кандидата учитываем все возможные варианты появления хвоста: 11, 110 или копирование последних трёх битов N.
Проверяем по убыванию:
Решаем с конца Начинаем с 169
Шаг 1 из 4
 

 

Решение текстом

Нужно найти максимальное значение R < 170. Поэтому проверяем возможные результаты по убыванию: 169, 168, 167, 166, …

Возможны три способа получить хвост. Если N делится на 3, копируются последние три разряда N. При остатке 1 дописывается 11₂, а при остатке 2 — 110₂.

169 = 10101001₂. Окончание 001 не равно ни 11, ни 110. После снятия трёх битов получаем N = 10101₂ = 21. Число 21 делится на 3, поэтому должны копироваться его последние три бита — 101. Но у кандидата стоит 001. Значит, 169 невозможно.

Для 168 после снятия трёх битов снова получаем N = 21, но у кандидата хвост 000 вместо нужного 101. Поэтому 168 также невозможно.

Для 167 = 10100111₂ нужно проверить два варианта.

Если снять 11, получаем N = 101001₂ = 41. Но 41 mod 3 = 2, поэтому должен дописываться хвост 110, а не 11.

Если снять три последние цифры 111, получаем N = 10100₂ = 20. Число 20 не делится на 3, значит копирование запрещено. При остатке 2 правильный хвост — 110, поэтому из N = 20 получилось бы 166.

Проверяем 166:

166 = 10100110₂.

Снимаем хвост 110:

N = 10100₂ = 20.

Остаток от деления 20 на 3 равен 2:

2 · 3 = 6 = 110₂.

Значит, хвост 110 действительно должен быть приписан:

10100 | 110 = 10100110₂ = 166.

166 получить можно, а 167, 168 и 169 — нельзя. Следовательно, максимальный результат меньше 170 равен 166.

Ответ: 166.


Как ускорить — необязательно

Для остатка 1 хвост равен 11₂, для остатка 2 — 110₂, при кратности 3 копируются три бита. Можно отдельно оценить три ветки; их лучшие результаты ниже 170: 163, 166 и 146. Максимум — 166.


Программное решение

Руками мы спускались от 169. Программа, наоборот, перебирает возможные N и выбирает максимальный R, который остаётся меньше 170.

Добавляется не меньше двух битов, поэтому R ≥ 4N. При R < 170 достаточно проверить N ≤ 42.



Вывод программы
166

Совпало с разбором.


По этому алгоритму получено R = 67. Восстанови N.


Не потеряй балл

  • При совпадении хвостов проверь обе ветки.
  • Не превращай скопированный хвост 010 в 10.