Найдите все натуральные числа, принадлежащие отрезку [101 000 000; 102 000 000], у которых ровно три различных чётных делителя (при этом количество нечётных делителей может быть любым). В ответе перечислите найденные числа в порядке возрастания.
Ответ:
Заметим, что, поскольку необходимо найти чётные делители числа, можно не рассматривать нечётные числа из диапазона. Если число чётное, то
Приведём решение на языке Pascal.
var
count, i, j, k, sqrtI: longint;
begin
for i := 101000000 to 102000000 do if i mod 2 = 0 then begin
count := 1;
sqrtI := round(sqrt(i));
for j := 2 to sqrtI do begin
if i mod j = 0 then begin
if j mod 2 = 0 then count := count + 1;
k := i div j;
if k mod 2 = 0 then begin
count:=count + 1;
if j = k then count:=count - 1;
end;
if count > 3 then break;
end;
end;
if count = 3 then writeln(i);
end;
end.
В результате работы программа должна вывести следующее:
101075762
101417282
101588258
101645282
Примечание.
Заметим, что в данной программе условие j = k и соответствующая команда count = count − 1 не будут выполнены ни разу, поскольку если квадратный корень из числа четный, то это число делится
Приведем решение, которое предложил Данил.
Число имеет ровно три четных делителя, если оно имеет вид 2 · p2, где p — простое число. Следовательно, можно искать квадратный корень из числа, деленного
Приведем программу на языке Pascal, реализующую этот способ.
var
i,j,p,simple: longint;
begin
for i := 101000000 to 102000000 do if i mod 2 = 0 then begin
p := round(sqrt(i div 2));
if 2*p*p = i then begin
simple := 1;
for j := 2 to p - 1 do if p mod j = 0 then begin
simple := 0;
break;
end;
if simple = 1 then writeln(i);
end;
end;
end.
Приведем математическое обоснование данного способа.
Пусть разложение тогда количество делителей числа m равно
В частности, четное число раскладывается на множители как
где множители ai — нечетные числа. Тогда число имеет
четных делителей и
нечетных.
По условию задачи требуется, чтобы число имело 3 четных делителя. Число 3 можно представить в виде произведения единственным способом 1 · (2 + 1), следовательно, разложение искомого числа на простые множители должно иметь вид 2 · p2.
Примечание.
Заметим, что число 101576162 не является подходящим, поскольку имеет делители 2, 20158, 10078 и 101576162. Тем читателям, программы которых выводят данное число, рекомендуем обратить внимание на цикл перебора делителей числа. Перебор осуществляется обычно до значения квадратного корня из числа. Для
Приведём другое решение на языке Python.
for i in range(101000000, 102000000 + 1):
if i % 2 == 0:
count = 1
sqrtI = round(i ** 0.5)
for j in range(2, sqrtI + 1):
if i % j == 0:
if j % 2 == 0:
count += 1
k = i // j
if k % 2 == 0:
count += 1
if j == k:
count -= 1
if count > 3:
break
if count == 3:
print(i)
Приведём решение Кузнецова Александра на языке Python.
def Simple(n):
s = n % 2 + 1
for i in range(s+1, int(n**0.5)+1, s):
if n%i==0:
return False
return True
for i in range(101000000, 102000000+1, 2):
b = i / 2
if round(b**0.5)**2 == b and Simple(int(b**0.5)) == True:
print(i)
Приведём решение Юрия Красильникова на языке Python.
def prime(n):
k = 2
while k**2 <= n:
if n%k == 0:
return False
k += 1
return True
bot,top = 101000000,102000000
mp = int(top**0.5)+3
nums = [2*p**2 for p in range(3,mp,2) if prime(p) and bot <= 2*p**2 <= top]
for n in nums:
print(n)

