Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «∗» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Найдите все натуральные числа, не превосходящие 108, для которых выполнены все условия:
— соответствуют маске 3?1*57;
— делятся на 1991 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке
возрастания, справа от каждого числа их частное от деления
Ответ:
Будем последовательно рассматривать каждое целое число,
Приведём решение на языке Python.
from fnmatch import *
for x in range(0, 10**8, 1991):
# Перебираем все числа от 0 с шагом 1991, будут получены числа кратные 1991
if fnmatch(str(x), '3?1*57'):
# Проверяем полученное число соответствию заданию
print(x, x // 1991)
В результате работы программа должна вывести следующее:
30117857 15127
31113357 15627
32108857 16127
33104357 16627
Приведём другое решение на языке Python.
x, y, ans = 0, '', []
num = int('3' + str(x) + '1' + y + '57')
for x in range(0, 10):
for y in range(1, 10000):
num = int('3' + str(x) + '1' + str(y)[1::] + '57')
if num % 1991 == 0 and num not in ans:
ans.append(num)
ans.sort()
for i in ans:
print(i, i // 1991)

