Форум » Выполнение и анализ алгоритмов для исполнителей » Задание 5. (№ 5103) - не совпадет ответ » Ответить

Задание 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], может быть получено в результате работы автомата? Подскажите, в чем ошибка в программе. [pre2] 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) [/pre2] Ответ на сайте: 44 Ответ программы: 60

Ответов - 7

Поляков: Агеева пишет: Сколько различных результатов, ...

s11kai: Константин Юрьевич, здравствуйте! Посмотрел опубликованное решение данной задачи, но не могу понять, для чего здесь объявляется переменная count, а затем ее значение еще и выводится на печать, если по условию необходимо найти … Сколько различных результатов, ... [pre2] 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) ) [/pre2] Спасибо!

s11kai: Агеева пишет: Не совпадает ответ с ответом на сайте можно попробовать чуть подправить ваш код, примерно так, ответ точно совпадет! [pre2] 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)) [/pre2]


s11kai: кстати Агеева пишет: elif int(s) % 2 != 0: если данную строку заменить на короткое слово "если": else: то восприятие вашего кода повысится!!! [pre2] 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) [/pre2] а результат работы программы останется правильным

s11kai: А если взглянуть на распечатку num, то приходим к выводу, что можно отказаться от использования переменной k, а следовательно, и от второго цикла, примерно так: [pre2] 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)) [/pre2] окончательно получаем: [pre2] 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)) [/pre2] а результат работы программы останется правильным

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))

s11kai: 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)) Если уж химичить, то без переливания из пустого в порожнее, т.е., уж лучше так: [pre2] 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)) [/pre2] Поскольку так будет и короче, и понятнее!



полная версия страницы