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