Top.Mail.Ru
Ответы

Программирование, простая обработка чисел

Помогите найти ошибку

На вход алгоритма подается натуральное число N. Алгоритм строит по нему новое число R следующим образом:
1) Строится двоичная запись числа N.
2) К этой записи дописываются еще несколько разрядов по следующему правилу: если число четное, то в конец числа (справа) дописывается 01, в противном случае - слева дописывается 1 и справа дописывается 10.
3) Результат переводится в десятичную систему исчисления и выводится на экран.
Например, N = 13; после выполнения пункта 1 получим запись 1101. После выполнения пункта 2 получаем число 1110110. Полученная таким образом запись является двоичной записью искомого числа R.
Найдите такое наименьшее число N, для которого результат работы данного алгоритма больше числа 214. В ответе запишите это число в десятичной системе счисления.

Правильный ответ: 23
Мой код выдает 22, не могу найти ошибку
def perekf(n):
rez=""
while n>0:
rez= str(n%2)+rez
n=n//2
return(rez)
for n in range(1,300):
r = perekf(n)
if r.count("1")%2==0: r = r+"01"
else: r= "1"+r+"10"
if int(r,2)>214:
print(n)
break



А вот такой код выдает 23
for N in range (1, 1000) :
N_bin = bin (N) [2 : ]
if N % 2 == 0 :
N_bin += '01'
else :
N_bin = '1' + N_bin + '10'
if int (N_bin, 2) > 214 :
print (N)
break

По дате
По рейтингу
Аватар пользователя
Просветленный

Ваша основная ошибка заключается в логике проверки четности числа и добавления разрядов. В первом коде вы проверяете количество единиц в двоичной записи числа, тогда как правильная логика должна проверять само число на четность или нечетность.

Давайте разберемся, как это должно работать и поправим ваш первый код:

Проверка числа на четность/нечетность должна производиться не через количество единиц в двоичной записи, а через остаток от деления на 2.
Двоичную запись можно получить с помощью встроенной функции bin().


1234567891011121314151617
 def perekf(n): 
    rez = "" 
    while n > 0: 
        rez = str(n % 2) + rez 
        n = n // 2 
    return rez 
 
 
for n in range(1, 300): 
    r = perekf(n) 
    if n % 2 == 0: 
        r = r + "01" 
    else: 
        r = "1" + r + "10" 
    if int(r, 2) > 214: 
        print(n) 
        break  
Аватар пользователя
Ученик

Пе