Как найти множество чисел кратных 51 по заданной маске?

Рейтинг: -2Ответов: 3Опубликовано: 12.03.2023

ЕГЭ информатика 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 ответов) или я неправильно понял задачу?

Ответы

▲ 2
  1. Для указанной маски 12*45* следует определить минимальное и максимальное числа.
    Минимумом явно будет число 1245, максимумом соответственно 129945 (а не 1'000'000)
  2. Для начального значения цикла следует подобрать ближайшее кратное 51, затем в цикле использовать шаг 51 для проверки только кратных чисел
  3. Для проверки маски можно использовать регулярное выражение "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
▲ 2

Ещё один вариант решения "в лоб", без оптимизации:

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
▲ -2

Доработал программу и все получилось)python