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