Тип 25 № 33495 

Раздел кодификатора ФИПИ: Обработка целочисленной информации. Нахождение делителей
i
Рассмотрим произвольное натуральное число, представим его всеми возможными способами в виде произведения двух натуральных чисел и найдём для каждого такого произведения разность сомножителей. Например, для числа 16 получим: 16 = 16 · 1 = 8 · 2 = 4 · 4, множество разностей содержит числа 15, 6 и 0. Найдите все натуральные числа, принадлежащие отрезку [2 000 000; 3 000 000], у которых составленное описанным способом множество разностей будет содержать не меньше трёх элементов, не превышающих 115. В ответе перечислите найденные числа в порядке возрастания.
Решение. Заметим, что у каждого делителя числа имеется пара, например, пары делителей числа 16 будут выглядеть так: 1 и 16, 2 и 8, 4 и 4, всего пять различных делителей. Отсюда можно заключить, что имеет смысл перебирать возможные делители числа от единицы до корня от самого числа. Если разность результата целочисленного деления рассматриваемого в данный момент числа на его найденный делитель и этого делителя не будет превышать 115, в переменной count будем накапливать единицу. Если число count после работы вложенного цикла будет не меньше трёх — выводим число на экран.
Приведём решение на языке 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;
}
Ответ: 2053440&2098080&2328480&2638944