Назовем маской числа последовательность цифр, в которой также могут встречаться следующие символы,
– символ «?»означает ровно одну произвольную цифру
– символ «*»означает любую последовательность цифр произвольной длины, в том числе и пустую последовательность
Среди натуральных чисел, не превышающих найдите все числа, соответствующие маске *16*9?0?, кратных 387. В ответе запишите все найденные числа в порядке возрастания через пробел.
Решение через циклы
ans = [] # Массив с найденными числами
for x in range(10): # Перебираем первый ’?’
for y in range(10): # Перебираем второй ’?’
for z in range(10): # Перебираем ’*’
# Т. к. числа не должны превышать 10̂7, то в числе может быть "задействована" лишь одна *
# Составляем числа:
s1 = int(str(z) + ’169’ + str(x) + ’0’ + str(y)) # составляем число, удовлетворяющее маске
s2 = int(’16’ + str(z) + ’9’ + str(x) + ’0’ + str(y)) # составляем число, удовлетворяющее маске
if s1 % 387 == 0:
ans.append(s1)
if s2 % 387 == 0:
ans.append(s2)
print(*sorted(ans)) # Выводим отсортированный массив
Решение через fnmatch
from fnmatch import *
# для оптимизации делаем цикл с шагом 387, начиная с числа кратного 387, для того чтобы проходиться по числам кратным 387
for i in range(0, 10 ** 7 + 1, 387):
if fnmatch(str(i), ’*16*9?0?’):
print(i, end=’ ’)
Решение через срезы
# для оптимизации делаем цикл с шагом 387, начиная с числа кратного 387, для того чтобы проходиться по числам кратным 387
for x in range(169119,10**7+1,387):
n = str(x)
if n[-2] == ’0’ and n[-4] == ’9’ and ’16’ in n[:-4]: # проверяем, что число удовлетворяет маске
print(x)