Задание №5 — Анализ простейших алгоритмов
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1) Строится четверичная запись числа N.
2) Далее эта запись обрабатывается по следующему правилу:
а) если число N делится на 4, то к этой записи дописываются две последние четверичные цифры;
б) если число N на 4 не делится, то остаток от деления умножается на 2, переводится в четверичную запись и дописывается в конец числа.
Полученная таким образом запись является четверичной записью искомого числа R.
3) Результат переводится в десятичную систему и выводится на экран.
Например, для исходного числа 11 = 234 результатом является число 23124 = 182, а для исходного числа 12 = 304 это число 30304 = 204.
Укажите минимальное число N, после обработки которого с помощью этого алгоритма получается число R, не меньшее 1088.
Правильный ответ
68
Пояснение
Решение:
Пусть — последняя цифра четверичной записи . Разберём, что приписывается справа в каждом случае.
- : приписываются две последние четверичные цифры, то есть запись удлиняется на два разряда, а приписанное значение равно . Значит .
- : — один разряд, поэтому .
- : — два разряда, поэтому .
- : — два разряда, поэтому .
Сверим с примерами из условия: , , ; , , . Совпадает.
Ключевое наблюдение: только при число увеличивается в 4 раза, во всех остальных случаях — в 16 раз.
Нужно наименьшее , при котором . Рассмотрим все четыре случая.
- : . Наименьшее число вида — это .
- : . Наименьшее число вида — это , .
- : . Наименьшее число вида — это , .
- : даёт — мало; следующее кратное четырём даёт — подходит.
Обратим внимание на «ловушку»: даёт , а даёт — оба меньше 1088. Наименьшее из чисел 273, 70, 71, 68 — это 68.
def alg(n):
q = ''
m = n
while m:
q = str(m % 4) + q
m //= 4
if n % 4 == 0:
q += q[-2:]
else:
t = (n % 4) * 2
q += str(t) if t < 4 else str(t // 4) + str(t % 4)
return int(q, 4)
print(min(n for n in range(1, 1000) if alg(n) >= 1088))
Ответ: 68