Решение. Заметим, что, поскольку необходимо найти чётные делители числа, можно не рассматривать нечётные числа из диапазона. Если число чётное, то 1 четный делитель у него уже есть, поэтому переменную count будем объявлять со значением 1. Находя очередной делитель числа, будем проверять, является ли этот делитель чётным, и, если является, будем прибавлять к переменной count единицу. Также заметим, что у каждого делителя числа есть парный делитель — если он чётный, будем прибавлять к переменой count единицу. Также учтём то, что у числа может быть 2 одинаковых делителя (например, у числа 4 два одинаковых делителя — числа 2 и 2).
Приведём решение на языке 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 не будут выполнены ни разу, поскольку если квадратный корень из числа четный, то это число делится на 4, и количество его четных делителей превысит 3 до того, как переменная j станет равна квадратному корню из числа.
Приведем решение, которое предложил Данил.
Число имеет ровно три четных делителя, если оно имеет вид 2 · p2, где p — простое число. Следовательно, можно искать квадратный корень из числа, деленного на 2. Если этот квадратный корень является простым числом, то само число имеет ровно три четных делителя.
Приведем программу на языке 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 на простые множители имеет вид
тогда количество делителей числа m равно
В частности, четное число раскладывается на множители как
где множители ai — нечетные числа. Тогда число имеет
четных делителей и
нечетных.
По условию задачи требуется, чтобы число имело 3 четных делителя. Число 3 можно представить в виде произведения единственным способом 1 · (2 + 1), следовательно, разложение искомого числа на простые множители должно иметь вид 2 · p2.
Примечание.
Заметим, что число 101576162 не является подходящим, поскольку имеет делители 2, 20158, 10078 и 101576162. Тем читателям, программы которых выводят данное число, рекомендуем обратить внимание на цикл перебора делителей числа. Перебор осуществляется обычно до значения квадратного корня из числа. Для числа 101576162 квадратный корень приближенно равен 10078,4 и значение 10078 может быть не проверено при неаккуратном задании границ цикла.
Приведём другое решение на языке 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)