Напишите программу, которая перебирает целые числа, большие 1 103 285 717, в порядке возрастания и ищет среди них числа, представленные в виде произведения ровно двух простых множителей, не обязательно различных, каждый из которых содержит ровно один раз в своей записи последовательность цифр «16».
В ответе для первых 5 найденных чисел запишите само число и наименьший из его простых множителей в соответствующие столбцы таблицы.
Количество строк в таблице для ответа избыточно.
Ответ:
ИЛИ
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 1010, найдите все числа, соответствующие маске 3?12?14*5, делящиеся
Количество строк в таблице для ответа избыточно.
Ответ:
##Приведём решение на языке Python.
def f(x):
for i in range(2, int(x**0.5)+1):
if x%i==0:
return [i]+f(x//i)
return [x]
count = 0
for x in range(1_103_285_718, 1_200_000_000):
d = f(x)
if len(d) == 2:
p1, p2 = d[0], d[1]
if str(p1).count('16') == 1 and str(p2).count('16') == 1:
print(x, min(d))
count += 1
if count == 5:
break
ИЛИ
Будем последовательно рассматривать каждое целое число,
Приведём решение на языке Python.
from fnmatch import *
for x in range(0, 10**10, 1917):
# Перебираем все числа от 0 с шагом 1917, будут получены числа кратные 1917
if fnmatch(str(x), '3?12?14*5'):
# Проверяем полученное число соответствию заданию
print(x, x//1917)
В результате работы программа должна вывести следующее:
351261495 183235
3212614035 1675855
3412614645 1780185
3712414275 1936575
3912414885 2040905
Приведём решение Юрия Красильникова на языке Python.
from itertools import product
d='0123456789'
twod=[''.join(x) for dl in range(3) for x in product(d,repeat=dl)]
a=sorted([int(f'3{x}12{y}14{z}5') for x in d for y in d for z in twod])
for y in [x for x in a if x%1917==0]: print(y,y//1917)
Приведём решение Сергея Донец на PascalABC.NET:
begin
foreach var x in Range(1917, 10**10, 1917) do
if x.ToString.IsMatch('^3.12.14.*5$')//3?12?14*5
then Println(x, x/1917);
end.

