Задание №5 — Анализ простейших алгоритмов
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
1) Строится четверичная запись числа N.
2) Далее эта запись обрабатывается по следующему правилу:
а) если число N делится на 4, то к этой записи дописываются две последние четверичные цифры;
б) если число N на 4 не делится, то остаток от деления умножается на 2, переводится в четверичную запись и дописывается в конец числа.
Полученная таким образом запись является четверичной записью искомого числа R.
Например, для исходного числа 11 = 234 результатом является число 23124 = 182, а для исходного числа 12 = 304 это число 30304 = 204.
Укажите максимальное число N, после обработки которого с помощью этого алгоритма получается число R, меньшее 261.
Правильный ответ
61
Пояснение
Решение:
Приписывание цифр справа — это умножение на степень четвёрки. Разберём, сколько цифр приписывается в каждом случае. Если делится на 4, приписываются сразу две цифры, и примерно в 16 раз больше . Если остаток равен 2 или 3, то удвоенный остаток равен или — это тоже две цифры, и снова . И только при остатке 1 удвоенный остаток равен — одна цифра, поэтому .
Нам нужно , то есть — маленькое, значит выгоден только случай с остатком 1. Из получаем , а вместе с условием наибольшее такое равно 61.
Проверка: , остаток , удвоенный остаток , поэтому . Все числа дают больший результат: 62, 63 и 64 удлиняют запись на две цифры (получается порядка тысячи), а следующий «дешёвый» кандидат даёт , что уже не меньше 261.
def to4(n):
s = ''
while n:
s = str(n % 4) + s
n //= 4
return s or '0'
def R(N):
q = to4(N)
q += q[-2:] if N % 4 == 0 else to4(2 * (N % 4))
return int(q, 4)
print(max(N for N in range(1, 1000) if R(N) < 261)) # 61
Ответ: 61