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

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

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

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

Например, маске 645*8?5 соответствуют числа 645835 и 64500835.

Среди натуральных чисел, не превышающих 108  , найдите все числа, соответствующие маске 34?8?97 и делящиеся на 29 без остатка. В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им частные от деления на 29.

Формат записи ответа: Найденное_число1 частное_от_деления_на_29_1 Найденное_число2 частное_от_деления_на_29_2 и тд.

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

# Импортируем модуль fnmatch для нужной функции
from fnmatch import *

# Нет смысла рассматривать числа вне данного промежутка,
# т.к они точно не подойдут
# Можно ещё больше сократить область, но это уже несильно повлияет на работу
for i in range(3000000, 4000000):
    # fnmatch — функция, сравнивающая строку с указанной маской
    # Возвращает True, если строка подходит к маске
    if fnmatch(str(i), ’34?8?97’) and i % 29 == 0:
        print(i, i//29)

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

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

Ответ: 3418897 117893 3468197 119593 3488497 120293
Оцените статью
Я решу все!