Задание №5 — Анализ простейших алгоритмов
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
1. Строится двоичная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
а) если число N делится на 3, то к этой записи дописываются три последние двоичные цифры;
б) если число N на 3 не делится, то остаток от деления умножается на 3, переводится в двоичную запись и дописывается в конец числа.
Полученная таким образом запись является двоичной записью искомого числа R.
3. Результат переводится в десятичную систему и выводится на экран.
Например, для исходного числа 12 = 11002 результатом является число 11001002 = 100, а для исходного числа 4 = 1002 это число 100112 = 19.
Укажите минимальное число R, большее 151, которое может быть получено с помощью описанного алгоритма. В ответе запишите это число в десятичной системе счисления.
Правильный ответ
163
Пояснение
Решение:
Алгоритм дописывает к двоичной записи числа либо два, либо три разряда. Если остаток от деления на 3 равен 1, приписывается — два разряда, и тогда . Если остаток равен 2, приписывается — три разряда, и . Если же кратно 3, приписываются три последние двоичные цифры самого , то есть .
Нам нужно наименьшее . Заметим, что , а любое семиразрядное двоичное число не превосходит 127, поэтому у искомого не меньше восьми разрядов; девятиразрядные числа не меньше 256, так что достаточно разобрать восьмиразрядные .
- Остаток 1: дописываются два разряда, значит шестиразрядное, , и . Из получаем ; ближайшее такое с остатком 1 — это , оно даёт .
- Остаток 2: дописываются три разряда, значит пятиразрядное, , и . Числа с остатком 2 дают , ; первое подходящее значение — 166.
- кратно 3 и пятиразрядное: дают соответственно ; первое подходящее — 173.
Наименьшее из чисел 163, 166 и 173 — это 163. Проверим: , остаток от деления 40 на 3 равен 1, значит дописываем и получаем .
Перебор подтверждает ответ:
def R(n):
b = bin(n)[2:]
if n % 3 == 0:
return int(b + b[-3:], 2) # дописали три последние цифры
return int(b + bin(n % 3 * 3)[2:], 2) # дописали остаток, умноженный на 3
print(min(R(n) for n in range(1, 1000) if R(n) > 151))
Ответ: 163