Пусть S — сумма квадратов минимального и максимального натуральных делителей целого числа, не считая единицы и самого числа. Если таких делителей у числа нет, то значение S считается равным нулю. Например, для числа 20 имеем Напишите программу, которая перебирает целые числа, меньшие 900 000, в порядке возрастания и ищет среди них такие, для которых значение S является простым числом.
В ответе запишите в первом столбце таблицы первые пять найденных чисел в порядке убывания, а во втором столбце — соответствующие им значения S.
Ответ:
Приведём решение на языке Python.
def Div(x):
s = set()
for y in range(2, int(x**0.5)+1):
if x%y == 0:
s |= {x//y, y}
return s if s else 0
li = []
for x in range(900000):
if len(li) == 5: break
if (v:=Div(x)):
ma, mi = max(v), min(v)
if not Div((v:=ma*ma + mi*mi)):
li.append([x, v])
[print(*i) for i in li[::-1]]
Ответ: 30; 229; 26; 173; 14; 53; 10; 29; 6; 13
Приведём решение Бориса Савельева на языке Python.
k=1
m=[]
for i in range(2,10**9):
d = int(i**0.5)
a = []
for j in range(2,d+1):
if i%j == 0:
a.append(j)
if i//j != j:
a.append(i//j)
if len(a) >= 2:
s = min(a)**2 + max(a)**2
f = 1
d = int(s ** 0.5)
for j in range (2, d+1):
if s%j == 0:
f = 0
break
if f == 1:
m.append(str(i)+' '+ str(s))
k += 1
if k >= 6:
break
for j in range (len(m)-1,-1,-1):
print(m[j])
Приведём решение Юрия Красильникова на языке Python.
def prostoe(n):
if n<2: return False
k=2
while k**2<=n:
if n%k==0: return False
k+=1
return True
def s(n):
k=2
while k**2<=n:
if n%k==0: return k**2+(n//k)**2
k+=1
return 0
n=1
a=[]
while len(a)<5:
sn=s(n)
if prostoe(sn): a.append((n,sn))
n+=1
for x in a[::-1]: print(*x)

