Пример 1
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R так:
1. Строится двоичная запись числа N.
2. К этой записи справа дописывается остаток от деления суммы её цифр на 2.
3. К полученной записи справа ещё раз дописывается остаток от деления суммы её цифр на 2.
Полученная запись является двоичной записью числа R.
Укажите минимальное число R, которое больше 97 и может быть получено в результате работы алгоритма.
Показать решение и ответ
1. Разбираемся, что дописывается в конце. Если в записи N чётное число единиц, дописывается 0, единиц остаётся чётное число — дописывается ещё 0: окончание 00. Если нечётное — дописывается 1, единиц становится чётное число — затем 0: окончание 10.
2. Значит, R чётное, и его две последние цифры определяются чётностью числа единиц в остальной части.
3. Проверяем чётные числа больше 97:
98 = 1100010: остальная часть 11000 — две единицы, нужно окончание 00, а стоит 10 — не подходит.
100 = 1100100: часть 11001 — три единицы, нужно 10, а стоит 00 — не подходит.
102 = 1100110: часть 11001 — три единицы, окончание 10 — подходит.
Проверка программой:
for n in range(1, 100): # перебираем исходные N по возрастанию
b = bin(n)[2:] # двоичная запись N без префикса 0b
for _ in range(2): # шаг дописывания выполняется дважды
b += str(b.count('1') % 2) # дописываем остаток от деления суммы цифр на 2
r = int(b, 2) # переводим запись обратно в число
if r > 97: # R растёт вместе с N, поэтому первое R > 97 — минимальное
print(r) # печатаем ответ
break # дальше перебирать незачемОтвет: 102
