Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
– символ «?» означает ровно одну произвольную цифру;
– символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 645*8?5 соответствуют числа 645835 и 64500835.
Среди натуральных чисел, не превышающих , найдите все числа, соответствующие маске 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)