Задача к ЕГЭ по информатике на тему «Маски» №1

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

– символ ”?”  означает ровно одну произвольную цифру;

– символ ” ∗”  означает любую последовательность цифр произвольной длины; в том числе ”∗ ”  может задавать и пустую последовательность.

Например, маске 123∗4?5  соответствуют числа 123495  и 12335495  .

Среди натуральных чисел, не превышающих 108  , найдите все числа, делящиеся на 394 и соответствующие маске ∗562??90  , но не соответствующие маске ?3 ∗7  .

Для каждого найденного числа в ответе укажите само число, а затем, через пробел, частное от деления на 394. Пары друг от друга так же отделите пробелом. Пары должны идти в порядке возрастания найденного числа.

Решение через fnmatch

import fnmatch
# для оптимизации делаем цикл с шагом 394, начиная с числа кратного 394, для того чтобы проходиться по числам кратным 394
for x in range(394,10**8,394):
    if fnmatch.fnmatch(str(x), ’*562??90’) and not fnmatch.fnmatch(str(x), ’?3*7’): # проверка, что число удовлетворяет одной маске и не удовлетворяет другой маске
        print(x, x//394)

Решение через срезы

# для оптимизации делаем цикл с шагом 394, начиная с числа кратного 394, для того чтобы проходиться по числам кратным 394
for x in range(5620410,10**8+1,394): #
    n = str(x)
    if ’562’ in n[-7:-4] and ’90’ in n[-2:]: # проверка, что число удовлетворяет маске
        if n[1] != ’3’ and n[-1] != ’7’: # проверка, что число не удовлетворяет маске
            print(x,x//394)

Ответ: 5628290 14285 25623790 65035 55626890 141185 75622390 191935 85629990 217335
Оцените статью
Я решу все!