Автор | Сообщение |
|
Отправлено: 17.10.22 22:06. Заголовок: Задание 5. (№ 5103) - не совпадет ответ
Не совпадает ответ с ответом на сайте. На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Строится двоичная запись числа N. 2) К этой записи дописываются ещё несколько разрядов по следующему правилу: если N чётное, то к нему слева дописывается 1, а справа - 10, если N нечетное – слева дописывается 11 и справа 0; 3) Результат переводится в десятичную систему и выводится на экран. Пример. Дано число N = 13. Алгоритм работает следующим образом: 1. Двоичная запись числа N: 1101. 2. Число нечетное, следовательно слева дописываем 11, справа 0 – 11+1101+0 = 1111010. 3. На экран выводится число 122. Сколько различных результатов, принадлежащих отрезку [800; 1500], может быть получено в результате работы автомата? Подскажите, в чем ошибка в программе. k = 0 for n in range(2000): s = bin(n) [2:] if int(s) % 2 == 0: s1 = '1' + s + '10' elif int(s) % 2 != 0: s1 = '11' + s + '0' r = int(s1, 2) if 800 <= r <= 1500: k += 1 print(k) Ответ на сайте: 44 Ответ программы: 60
|
|
|
Ответов - 7
[только новые]
|
|
|
| Администратор
|
Сообщение: 3758
|
|
Отправлено: 18.10.22 20:58. Заголовок: Агеева пишет: Сколь..
Агеева пишет: цитата: | Сколько различных результатов, ... |
|
|
|
|
|
Отправлено: 09.11.22 03:34. Заголовок: Константин Юрьевич, ..
Константин Юрьевич, здравствуйте! Посмотрел опубликованное решение данной задачи, но не могу понять, для чего здесь объявляется переменная count, а затем ее значение еще и выводится на печать, если по условию необходимо найти … цитата: | Сколько различных результатов, ... |
| def alg( n ): s = f"{n:b}" if n % 2 == 0: s = '1' + s + '10' else: s = '11' + s + '0' return int(s, 2) count = 0 res = set() for n in range(1000): if 800 <= alg(n) <= 1500: count += 1 res.add( alg(n) ) print( count ) print( len(res) ) Спасибо!
|
|
|
|
Отправлено: 08.11.22 12:21. Заголовок: Агеева пишет: Не со..
Агеева пишет: цитата: | Не совпадает ответ с ответом на сайте |
| можно попробовать чуть подправить ваш код, примерно так, ответ точно совпадет! k=set() for n in range(2000): s = bin(n) [2:] if n % 2 == 0: s1 = '1' + s + '10' else: s1 = '11' + s + '0' r = int(s1, 2) if 800 <= r <= 1500: k.add(r) print(len(k))
|
|
|
|
Отправлено: 08.11.22 12:42. Заголовок: кстати Агеева пишет:..
кстати Агеева пишет: если данную строку заменить на короткое слово "если": else: то восприятие вашего кода повысится!!! k = 0 num = [0]*1501 for n in range(2000): s = bin(n) [2:] if int(s) % 2 == 0: s1 = '1' + s + '10' else: s1 = '11' + s + '0' r = int(s1, 2) if 800 <= r <= 1500: num[r]+= 1 # исключаем повторяющиеся одинаковые значения for n in range(800,1500+1): if num[n]>0: k=k+1 print(k) а результат работы программы останется правильным
|
|
|
|
Отправлено: 09.11.22 02:23. Заголовок: А если отказаться от..
А если взглянуть на распечатку num, то приходим к выводу, что можно отказаться от использования переменной k, а следовательно, и от второго цикла, примерно так: num = [0]*1501 for n in range(500): s = bin(n) [2:] if int(s) % 2 == 0: s1 = '1' + s + '10' else: s1 = '11' + s + '0' r = int(s1, 2) # и от данной строки можно избавиться if 800 <= r <= 1500: num[r]+= 1 print(num.count(2)+ num.count(1)) окончательно получаем: num = [0]*1501 for n in range(500): s = bin(n) [2:] if int(s) % 2 == 0: s1 = '1' + s + '10' else: s1 = '11' + s + '0' if 800 <= int(s1, 2) <= 1500: num[int(s1, 2)]+= 1 print(num.count(2)+ num.count(1)) цитата: | а результат работы программы останется правильным |
|
|
|
|
|
Отправлено: 11.01.23 08:23. Заголовок: Как вариант: sp = f..
Как вариант: sp = [] for n in range (1000): r = bin(n)[2:] if n % 2 == 0: r = '1'+r+'10' else: r = '11'+r+'0' if 800<=int(r,2)<=1500: sp.append(int(r,2)) sp1=set(sp) print(len(sp1))
|
|
|
|
Отправлено: 11.01.23 16:25. Заголовок: Dan пишет: Как вари..
Dan пишет: цитата: | Как вариант: sp = [] for n in range (1000): r = bin(n)[2:] if n % 2 == 0: r = '1'+r+'10' else: r = '11'+r+'0' if 800<=int(r,2)<=1500: sp.append(int(r,2)) sp1=set(sp) print(len(sp1)) |
| Если уж химичить, то без переливания из пустого в порожнее, т.е., уж лучше так: sp = set() for n in range (1000): r = bin(n)[2:] if n % 2 == 0: r = '1'+r+'10' else: r = '11'+r+'0' if 800<=int(r,2)<=1500: sp.add(int(r,2)) print(len(sp)) Поскольку так будет и короче, и понятнее!
|
|
|
|