Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Найдите все натуральные числа, не превосходящие 108, для которых выполнены
все условия:
— соответствуют маске 1?4*6?8;
— делятся на 2622 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, справа от каждого числа их частное от деления
Ответ:
Будем последовательно рассматривать каждое целое число,
Приведём решение на языке Python.
from fnmatch import *
for x in range(0, 10**8, 2622):
# Перебираем все числа от 0 с шагом 2622, будут получены числа кратные 2622
if fnmatch(str(x), '1?4*6?8'):
# Проверяем полученное число соответствию заданию
print(x, x // 2622)
В результате работы программа должна вывести следующее:
154698 59
11468628 4374
12425658 4739
15401628 5874
16476648 6284
17433678 6649
19452618 7419
Приведём решение Юрия Красильникова на языке Python.
from itertools import product
цифры = '0123456789'
# Т. к. число < 10**8 (число 10**8, очевидно, не соответствует маске),
# то последовательность на месте "*" не может быть длиннее 2.
звезды = [''.join(x) for длина in range(3) for x in product(цифры,repeat=длина)]
# звезды - все строки из цифр длиной от 0 до 2
числа = sorted([int(f'1{ц1}4{зв}6{ц2}8') for ц1 in цифры for ц2 in цифры for зв in звезды])
# числа - сортированный список всех чисел меньше 10**8, отвечающих маске
for x in числа:
if x%2622 == 0: # если число делится на 2622 - печатаем
print(x,x//2622)

