Форум » Обработка целых чисел » (№6189) (Р.Сорокин) » Ответить

(№6189) (Р.Сорокин)

Amo: (№ 6189) (Р. Сорокин) Назовём маской числа последовательность цифр, в которой такжемогут встречаться следующие символы: — символ «#» означает любую последовательность четных цифр произвольной длины; втом числе «#» может задавать и пустую последовательность. — символ «?» означает одну любую цифру. Например, маске 1#9? соответствуют числа 190, 146891. Найдите все натуральные числа, которые не превышают 10^11 , соответствуют маске1 23#45?67 и делятся на 257. В ответе запишите все найденные числа в порядке возрастания, а справа от каждого число – частное от деления этого числа на 257. В этой задаче у меня не сходится ответ: ответ у автора: 788565321 2826399 7855635321 28156399 7865679321 28192399 78156939321 280132399 78856113321 282638399 78956553321 282998399 А у меня ответ получается в несколько раз больше по количеству чисел. Подскажите, где моя ошибка? [pre2] R = ['0', '2', '4', '6', '8'] for i in range(257, 10 ** 11 + 1, 257): s = str(i) if not(s[:3] == '123' and s[-5:-3] == '45' and s[-2:] == '67'): continue if len(s) == 7: print(i, i / 257) else: substr = s[3:-5] flag = True for ch in substr: if not(ch in R): break if flag: print(i, i / 257) [/pre2]

Ответов - 4

Amo: Мой ответ просто гигантский: 123445067 480331.0 1232245867 4794731.0 1233145367 4798231.0 1237745667 4816131.0 1238645167 4819631.0 12304345567 47876831.0 12305245067 47880331.0 12308945867 47894731.0 12309845367 47898231.0 12314445667 47916131.0 12315345167 47919631.0 12319045967 47934031.0 12319945467 47937531.0 12324545767 47955431.0 12325445267 47958931.0 12330045567 47976831.0 12330945067 47980331.0 12334645867 47994731.0 12335545367 47998231.0 12340145667 48016131.0 12341045167 48019631.0 12344745967 48034031.0 12345645467 48037531.0 12350245767 48055431.0 12351145267 48058931.0 12355745567 48076831.0 12356645067 48080331.0 12360345867 48094731.0 12361245367 48098231.0 12365845667 48116131.0 12366745167 48119631.0 12370445967 48134031.0 12371345467 48137531.0 12375945767 48155431.0 12376845267 48158931.0 12381445567 48176831.0 12382345067 48180331.0 12386045867 48194731.0 12386945367 48198231.0 12391545667 48216131.0 12392445167 48219631.0 12396145967 48234031.0 12397045467 48237531.0

Amo: Неверно указала авторские ответы, вот они: 123445067 480331 1232245867 4794731 1238645167 4819631 12386045867 48194731

Ж: Перед Break надо опустить флажок [pre2] R = ['0', '2', '4', '6', '8'] for i in range(12300000-12300000%257, 10 ** 11 + 1, 257): s = str(i) if s[:2]!='12': break if not (s[:3] == '123' and s[-5:-3] == '45' and s[-2:] == '67'): continue if len(s) == 8: print(i, i / 257) else: substr = s[3:-5] flag = True for ch in substr: if not (ch in R): flag=False break if flag: print(i, i // 257) [/pre2] Ваш код быстро выдаст первые три ответа, но сильно задержится с последним. если его поправить, как я показала, то он тоже быстро справится. Вот другой код, который быстро решает задачу. [pre2] from itertools import * sp=lambda k: [''.join(c) for c in product('02468',repeat=k)] sp=sp(0)+sp(1)+sp(2)+sp(3) for i in range(12300000,10**9+1): s=str(i) if s[:2]!='12': break if s[:3]=='123' and s[3:-5] in sp and s[-5:-3]=='45' and s[-2:]=='67' : for c in sp: num=(int(s[:3]+ c +s[-5:])) if num%257==0: l.append((num, num//257)) print(*sorted(l), sep='\n') [/pre2]


Amo: Ошибку нашла. В условии нужно было флаг опустить [pre2] if not(ch in R): flag = False break [/pre2]



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