Задание №5 — Анализ простейших алгоритмов
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
1) Из числа N вычитается остаток от деления N на 8, после чего прибавляется остаток от деления N на 2.
2) Строится двоичная запись полученного результата.
3) К этой записи дописываются справа ещё два разряда по следующему правилу:
а) складываются все цифры построенной двоичной записи, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 11100 преобразуется в запись 111001;
б) над этой записью производятся те же действия — справа дописывается остаток от деления суммы её цифр на 2.
Полученная таким образом запись является двоичной записью искомого числа R.
Укажите минимальное число R, большее 97, которое может являться результатом работы данного алгоритма. В ответе это число запишите в десятичной системе счисления.
Правильный ответ
102
Пояснение
Решение:
Обозначим — результат первого шага. Число кратно 8, а прибавляется 0 для чётного и 1 для нечётного. Значит, — это число вида или , и любое такое число достижимо.
Пусть в двоичной записи ровно единиц и . На шаге 3а справа приписывается , после чего сумма цифр чётна, поэтому на шаге 3б приписывается 0. Значит .
Нужно наименьшее . Так как , из следует , то есть . Подходящие значения — это 24, 25, 32, 33, …
- : единиц две, , — это не больше 97, не подходит;
- : единиц три, , запись , — подходит.
Все более крупные дают , поэтому наименьшее значение — 102.
def alg(n):
b = bin(n - n % 8 + n % 2)[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 > 97))
Ответ: 102