Python

Найдите ошибку в коде

На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1.  Строится двоичная запись числа N.
2.  К этой записи дописываются справа ещё два разряда по следующему правилу: складываются все цифры двоичной записи, если
а)  сумма нечетная к числу дописывается 11,
б)  сумма четная, дописывается 00.
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R. Укажите такое наименьшее число R, которое превышает 114 и может являться результатом работы алгоритма. В ответе это число запишите в десятичной системе счисления.
Мой код:
for n in range(1, 1000):
s = bin(n)[2:]
if s.count('1') % 2 == 1:
s += '11'
if s.count('1') % 2 == 0:
s += '00'
if int(s, 2) > 114:
print(n)
break
Правильный ответ 115, а у меня выходит 28. Решал через питон
Esen :)
Esen :)
136
Программа правильная, только выводится не то. Сейчас выводится N, а надо R, то есть
 print(int(s, 2)) 
Ну и лучше вместо
 if s.count('1') % 2 == 1:  
s += '11'
if s.count('1') % 2 == 0:
s += '00'
сделать
 if s.count('1') % 2 == 1:  
s += '11'
else:
s += '00'
Антон Кичаев
Антон Кичаев
12 091
Лучший ответ
Ошибка в коде заключается в неправильной проверке условия добавления двух разрядов. В вашем коде вы проверяете условие для суммы цифр двоичной записи числа N, а в задаче говорится о сумме цифр уже расширенной записи числа N. Также вы неправильно определяете четность и нечетность, так как в задаче говорится, что если сумма цифр нечетная, то нужно добавлять 11, а если четная, то 00.

Исправленный код:
 for n in range(115, 1000): 
s = bin(n)[2:]
s_sum = sum(int(d) for d in s)
if s_sum % 2 == 1:
s += '11'
if s_sum % 2 == 0:
s += '00'
if int(s, 2) > 114:
print(n)
break
Теперь выводится правильный ответ 115.
Рома Петрук
Рома Петрук
1 402
Антон Кичаев А если написать не
 range(115,  
Рома Петрук это не является ошибкой, так как в цикле перебираются все возможные значения N начиная с 57, и когда R, полученный из соответствующего N, первый раз превышает 114, цикл завершается. Таким образом, получается правильный ответ, хоть и немного нестандартным способом.
Рома Петрук Если мы изменим условие на "превышает 32", то программа выведет наименьшее число R, которое удовлетворяет этому условию. При этом программа будет работать корректно, поскольку все вычисления внутри нее остаются неизменными, и единственное, что изменится, это условие выхода из цикла, когда будет найдено первое число, удовлетворяющее новому условию.
 for n in range(115, 10000): 
s = bin(n)[2:]
if s.count('1') % 2 == 1:
s += '11'
if s.count('1') % 2 == 0:
s += '00'
if int(s, 2) > 114:
print(n)
break
Проблема вашего кода в том, что вы перебираете все числа от 1 до 1000, а не только те, которые превышают 114. В результате, ваш код находит первое число, удовлетворяющее условию для любого n, а не для наименьшего числа, которое превышает 114.

Чтобы исправить код, нужно изменить цикл for, чтобы он начинался с числа 115, а не с 1, и заканчивался на достаточно большом числе (например, 10000), чтобы убедиться, что наименьшее число, которое превышает 114, будет найдено. Вот исправленный код:
BK
Bekzod Kamilov
367
Esen :) Внатуре, большое спасибо
Esen :) А ты как ии пользуешься? В телеге ботом?
Esen :) Понял