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

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

1) символ «?» означает ровно одну произвольную цифру;

2) символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих  109  , найдите все числа, соответствующие маске 3*3?12, делящиеся на 3952 без остатка, у которых также сумма цифр числа является нечётной. В ответе запишите первые пять чисел в порядке возрастания, и через пробел – соответствующие им результаты деления этих чисел на 3952.

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

Способ решения 1:
from fnmatch import fnmatch
count = 0
# для оптимизации делаем цикл с шагом 3952, начиная с числа кратного 3952, для того чтобы проходиться по числам кратным 3952
for x in range(35568,10**9+1,3952):
# проверка, что число соответствует маске и выполняет все условия
    if fnmatch(str(x),’3*3?12’) and sum(map(int,str(x))) % 2 != 0:
        count += 1
        print(x,x//3952)
        if count > 4:
            break

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

from itertools import product # импортируем product из itertools
digits = ’0123456789’ #все возможные цифры
res = [] # список всех подходящих чисел под маску
for i in range(5): # делаем перебор для звёздочки
    for digit_1 in product(digits,repeat = i): # симулируем звёздочку
        for digit_2 in product(digits,repeat = 1): # симулируем вопрос
            res += [int(’3’+’’.join(digit_1) + ’3’ + ’’.join(digit_2) + ’12’)]
for x in sorted(set(res)):
    if x <= 10**9 and x % 3952 == 0 and sum(map(int,str(x))) % 2 != 0:
        print(x,x//3952)


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

# для оптимизации делаем цикл с шагом 3952, начиная с числа кратного 3952, для того чтобы проходиться по числам кратным 3952
for x in range(35568,10**9,3952):
    n = str(x)
    # проверка, что число соответствует маске и выполняет все условия
    if n[0] == ’3’ and ’12’ in n[-2:] and n[-4] == ’3’ and sum(map(int,n)) % 2 != 0:
        print(x,x//3952)

Ответ: 303043312 76681 305513312 77306 306303712 77506 323593712 81881 332683312 84181
Оцените статью
Я решу все!