Здравствуйте, Константин Юрьевич!
Вчера меня попросили помочь с решением пятого задания из демоверсии 2023, сослался на ваш сайт, поскольку у вас можно найти все, но, как оказалось, вы еще не проводили разбора данного задания.
Сходу смог придумать только частные решения, если сочтете возможным что-либо опубликовать, буду вам благодарен.
Рассуждал примерно так: Известно, что число 15 в двоичном коде = 1111, после обработки оно даст двоичный код 10110 = десятичному 22, что меньше 40. Стало быть, начинаем обрабатывать числа в цикле с 16.
# для 15 < n < 24, работа с двоичным кодом
for n in range(16,23+1):
k = s = bin(n)[2:]
if s.count("1")%2 == 0:
s=s+'0'
else:
s=s+'1'
s = s.replace('10', '11',1)
print(n,k,s,int(s,2))
# для 15 < n < 24, работа с десятичным числом
for n in range(16,23+1):
s = bin(n)[2:]
if s.count("1")%2 == 0:
k = n*2
else:
k = n*2+17
print(n,s,bin(k)[2:],k)
результат работы программы:
16 10000 110001 49 17 10001 100010 34
18 10010 100100 36
19 10011 110111 55
20 10100 101000 40 21 10101 111011 59
22 10110 111101 61
23 10111 101110 46 если невнимательно прочитать вопрос, то анализируя работу программы можно выбрать неверные ответы
А вот сегодня догнал, как можно перейти от частного случая к полновесному решению обрабатывающему любые числа, вдруг кому-то пригодится
# общий случай для любого числа n > 1
for n in range(1,240):
kk = s = bin(n)[2:]
if s.count("1")%2 == 0:
s = '10' + s[2:] + '0'
else:
s = '11' + s[2:] + '1'
if int(s,2)>40:
# print(n,kk,s,int(s,2)) данная строка для визуализации работы программы
break
print('ответ:',n)
С уважением, Александр