Как найти множество чисел кратных 51 по заданной маске?
ЕГЭ информатика 2023
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ
"?"означает ровно одну произвольную цифру; - символ
"*"означает любую последовательность цифр произвольной длины; в том числе"*"может задавать и пустую последовательность.
Например, маске123*4?5соответствуют числа123405и12300425.
Среди натуральных чисел, не превышающих 106, найдите все числа,
соответствующие маске 12*45* и делящиеся на число 51 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им частные от деления на 51.
Моя программа:
for n in range(0,10):
for i in range(0,10):
s = '12'+str(n)+'45'+str(i)
if int(s) % 51 == 0:
print(s, int(s) / 51)
Что она выводит:
122451 2401.0
Только одна пара в ответе (обычно в этих задачах 4-6 ответов) или я неправильно понял задачу?
Ответы (3 шт):
- Для указанной маски
12*45*следует определить минимальное и максимальное числа.
Минимумом явно будет число1245, максимумом соответственно129945(а не1'000'000) - Для начального значения цикла следует подобрать ближайшее кратное 51, затем в цикле использовать шаг 51 для проверки только кратных чисел
- Для проверки маски можно использовать регулярное выражение
"12\d*45\d*"в функцииre.match
import re
n = 1245
if n % 51 != 0:
n += 51 - n % 51
m = min(129946, 1000000)
for i in range(n, m, 51):
if (re.match("12\d*45\d*", str(i))):
print (i, i // 51)
Результат:
122145 2395
122451 2401
124542 2442
124593 2443
127245 2495
Ещё один вариант решения "в лоб", без оптимизации:
for x in [''] + list(map(str, range(100))):
for y in [''] + list(map(str, range(100))):
s = '12' + x + '45' + y
if len(s) <= 6 and int(s) % 51 == 0:
print(s, int(s) // 51)
Просто перебираем в качестве первого фрагмента пустое место и числа от 0 до 99 и тоже самое для второго фрагмента.
124542 2442
124593 2443
122451 2401
122145 2395
127245 2495
