Пусть M (N) — сумма двух наибольших различных натуральных делителей натурального
Найдите 5 наименьших натуральных чисел,
Ответ:
Будем последовательно рассматривать каждое целое число,
Приведём решение на языке Pascal.
var
i, j, halfI, del: int64;
countDel, count: integer;
begin
count := 0;
i := 11000001;
while (count < 5) do begin
halfI := i div 2;
del := 0;
countDel := 0;
for j := halfI downto 2 do
if (i mod j = 0) then begin
countDel := countDel + 1;
del := del + j;
if del > 10000 then break
else if countDel = 2 then begin
writeln(del);
count := count + 1;
break;
end;
end;
i := i + 1;
end;
end.
В результате работы программа должна вывести следующее:
8672
8388
8532
7042
7364
Приведём решение на языке Python.
count = 0
i = 11000001
while count < 5:
halfI = i // 2
dell = 0
countDel = 0
for j in range(halfI, 1, -1):
if i % j == 0:
countDel += 1
dell += j
if dell > 10000:
break
elif countDel == 2:
print(dell)
count += 1
break
i += 1
Приведём решение Романа Архипушкина на языке Python.
n = 11000000
cnt = 0
while cnt < 5:
n += 1
m = -1
lst = []
for i in range(2, int(n**0.5)):
if n % i == 0:
lst.append(i)
if len(lst) == 2:
m = n / lst[0] + n / lst[1]
break
if len(lst) == 1:
m = lst[0] + n / lst[0]
if 0 < m < 10000:
print(int(m))
cnt += 1
Приведём решение Михаила Глинского на языке Python.
def f(x):
d = set()
for i in range(2,int(x**.5)+1):
if x%i==0:
d.add(i)
d.add(x//i)
d=sorted(d)
if len(d) > 1: return d[-1]+d[-2]
else: return 0
x=11_000_000
k=0
while k<5:
x+=1
if 0 < f(x) < 10000:
print(f(x))
k+=1
Приведём решение Сергея Донец на языке PascalABC.NET.
uses School;
begin
var k := 0;
var n := 11_000_001;
var res := new List
(); while k < 5 do begin
var divisors := n.Divisors.SkipLast.TakeLast(2).ToArray;
if divisors.Length = 2 then begin
var M := divisors.Aggregate(0, (a, b)-> a + b);
if (M < n)and(M < 10000) then begin res.Add(M);k += 1;end;end;
n += 1;end;
res.Printlines;
end.

