Маска числа — это последовательность цифр, в которой могут встречаться специальные символы «?» и «*». Символ «?» означает ровно одну произвольную цифру, символ «*» означает произвольную (в том числе
пустую) последовательность цифр.
Например, маске 123*4?5 соответствуют числа 123405 и 12376415.
Найдите все натуральные числа, принадлежащие интервалу [108; 2 · 108],
которые соответствуют маске ?*42*81 и имеют ровно три натуральных делителя.
В ответе запишите все найденные числа в порядке возрастания.
Ответ:
Приведём решение на языке Python.
def F(n):
deliteli = set()
for i in range(2, int(n**0.5)+1):
if n%i == 0:
deliteli|={i, n//i}
return deliteli
from fnmatch import *
for x in range (10**8, 2*10**8+1):
if fnmatch(str(x),'?*42*81'):
if len(F(x)) == 1:
print(x)
Ответ:
114297481
141824281
142587481
149842081
Ответ: 114297481, 141824281, 142587481, 149842081.
Приведём решение Юрия Красильникова на языке Python.
def prostoe(n):
k=2
while k**2 <= n:
if n%k==0: return False
k+=1
return True
# Если число имеет ровно три натуральных делителя, то оно является квадратом простого числа.
from fnmatch import fnmatch
for x in range (10**4,int(2**0.5*10**4+1)):
if prostoe(x) and fnmatch(str(x**2),'?*42*81'): print(x**2)
Приведём решение Сергея Донец на PascalABC.NET:
uses School;
begin var low := 100_000_000;
var high := 200_000_000;
var start := Ceil(Sqrt(low));
var finish := Trunc(Sqrt(high));
foreach var p in Primes(start, finish) do
begin
var n := p * p;
if n.ToString.IsMatch('^..*42.*81$')
then n.PrintLn;
end;
end.

