Задание №5 — Анализ простейших алгоритмов
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
1) Из числа N вычитается остаток от деления N на 4.
2) Строится двоичная запись полученного результата.
3) К этой записи дописываются справа ещё два разряда по следующему правилу:
а) складываются все цифры построенной двоичной записи, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 11100 преобразуется в запись 111001;
б) над этой записью производятся те же действия - справа дописывается остаток от деления суммы её цифр на 2.
Полученная таким образом запись является двоичной записью искомого числа R. Укажите минимальное число R, большее 100, которое может являться результатом работы данного алгоритма. В ответе это число запишите в десятичной системе счисления.
Правильный ответ
114
Пояснение
Решение:
Обозначим — результат первого шага. Это ближайшее снизу число, кратное 4, и при переборе всех величина пробегает в точности все кратные четырём числа.
Пусть в двоичной записи ровно единиц и . На шаге 3а справа приписывается . После этого сумма цифр равна — она чётна при любом , поэтому на шаге 3б приписывается 0.
Итак, к записи всегда приписываются два разряда и 0, то есть , где — чётность количества единиц в .
Нужно наименьшее . Так как , из следует , то есть ; а кратно 4, поэтому . Величина растёт вместе с , значит достаточно взять наименьшее допустимое .
, единиц три, : запись превращается в , затем в , то есть .
Для сравнения, предыдущее кратное четырём даёт и — это не больше 100.
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(min(r for r in {alg(n) for n in range(1, 1000)} if r > 100))
Ответ: 114