Рассмотрим произвольное натуральное число, представим его всеми возможными способами в виде произведения двух натуральных чисел и найдём для каждого такого произведения разность сомножителей. Например, для
Ответ:
Заметим, что у каждого делителя числа имеется пара, например, пары делителей
Приведём решение на языке Pascal.
var
count, i, j: longint;
sqrtI: real;
begin
for i := 2000000 to 3000000 do begin
sqrtI := sqrt(i);
count := 0;
for j := 1 to round(sqrtI) do begin
if (i mod j = 0) then begin
if (((i div j) - j) < 116) then
count := count + 1;
end;
end;
if count > 2 then writeln(i);
count := 0;
end;
end.
В результате работы программа должна вывести следующее:
2053440
2098080
2328480
2638944
Приведём решение на языке Python.
for i in range(2000000, 3000001):
sqrti = i**0.5
k = 0
for j in range(1, round(sqrti)):
if i % j == 0:
if (abs(i / j) - j) <= 115:
k += 1
if k > 2: print(i)
k = 0
Приведём решение Ильи Андрианова на языке Python.
def divisors(x):
div = []
for j in range(1, int(x**0.5)+1):
if x % j == 0:
if (x // j) - j < 115:
div.append((x // j) - j)
return sorted(set(div))
for x in range(2000000, 3000000+1):
d = divisors(x)
if len(d) >= 3:
print(x)
Приведём решение Артёма Гридина на языке С++.
#include #include int main() { int cnt = 0; for (int n = 2000000; n <= 3000000; n++) { cnt = 0; for (int i = 1; i < ceil(sqrt(n)); i++) { if (n % i == 0 && n / i - i <= 115) cnt++; if (cnt >= 3) { printf("%i\n", n); break; } } } return 0; }

