Задание №5 — Анализ простейших алгоритмов
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
1) Из числа N вычитается остаток от деления N на 4.
2) Строится двоичная запись полученного результата.
3) К этой записи дописываются справа ещё два разряда по следующему правилу:
а) складываются все цифры построенной двоичной записи, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 11100 преобразуется в запись 111001;
б) над этой записью производятся те же действия - справа дописывается остаток от деления суммы её цифр на 2.
Полученная таким образом запись является двоичной записью искомого числа R. Укажите такое наибольшее число N, для которого результат работы данного алгоритма меньше 64. В ответе это число запишите в десятичной системе счисления.
Правильный ответ
15
Пояснение
Решение:
Обозначим — результат первого шага. Это ближайшее снизу число, кратное 4, и при переборе всех величина пробегает в точности все кратные четырём числа.
Пусть в двоичной записи ровно единиц и . На шаге 3а справа приписывается . После этого сумма цифр равна — она чётна при любом , поэтому на шаге 3б приписывается 0.
Итак, к записи всегда приписываются два разряда и 0, то есть , где — чётность количества единиц в .
Условие даёт , то есть . С учётом кратности четырём получаем .
Проверим : единиц две, , запись , то есть — подходит. Следующее значение даёт и — уже не подходит.
Значит, . Этому равенству удовлетворяют ; наибольшее из них — 15.
def alg(n):
b = bin(n - n % 4)[2:]
b += str(sum(map(int, b)) % 2)
b += str(sum(map(int, b)) % 2)
return int(b, 2)
print(max(n for n in range(1, 1000) if alg(n) < 64))
Ответ: 15