Почему мой ответ неверный
Автомат обрабатывает натуральное число N > 1 по следующему алгоритму:
- Строится двоичная запись числа N.
- В конец записи (справа) дописывается вторая справа цифра двоичной записи.
- В конец записи (справа) дописывается вторая слева цифра двоичной записи.
- Результат переводится в десятичную систему. Для скольких значений N в результате работы алгоритма получится число, принадлежащее отрезку [150; 250]?
Мой код:
def perevod(n):
return (int(n,base=2))
s=0
for i in range(10,1000):
a=bin(i)
if str(a)[3]==1:
a=str(a)+'1'
else:
a=str(a)+'0'
if str(a)[-3]==1:
a=str(a)+'1'
else:
a=str(a)+'0'
b = str(a)[2:]
c = perevod(b)
if c>=150 and c<=250:
s+=1
print(s)
Но верный ответ - 24, а мне выдаёт 25, откуда берётся лишняя единица?
Ответы (2 шт):
Условия str(a)[3]==1 и str(a)[-3]==1 ложные, из-за строгой типизации, что, например, при сравнении '1' и 1 вернет False, т.к. это разные типы.
Да и сами этим проверки излишние, т.к. можно взять сами значения из двоичного представления числа, т.к. bin вернет строку
Переписал код:
def perevod(n: str) -> int:
return int(n, base=2)
s = 0
for i in range(10, 1000):
a = bin(i)[2:]
a += a[-2]
a += a[1]
c = perevod(a)
if 150 <= c <= 250:
s += 1
print(s)
# 24
Ошибка в том что условие str(a)[3]==1 всегда ложно.
a - строка. То есть вызов str не нужен. Выражение a[3] имеет тип строка и состоит из одного символа. Никакой символ не может быть равен числу один. Условие всегда ложно.
Правим код:
if str(a)[3]=='1':
a=str(a)+'1'
else:
a=str(a)+'0'
Замечаем что его можно переписать:
if str(a)[3] == '1':
a = str(a) + str(a)[3]
else:
a = str(a) + str(a)[3]
Обе части if одинаковы. Убираем if:
a = str(a) + str(a)[3]
Упрощаем:
a = a + a[3]
Ещё упрощаем:
a += a[3]
Целиком код выглядит так:
def perevod(n):
return int(n, base=2)
s = 0
for i in range(10, 1000):
a = bin(i)
a += a[3]
a += a[-3]
b = a[2:]
c = perevod(b)
if 150 <= c <= 250:
s += 1
print(s)