Задания
Версия для печати и копирования в MS Word

Най­ди­те все на­ту­раль­ные числа, при­над­ле­жа­щие от­рез­ку [106 000 000; 107 000 000], у ко­то­рых ровно три раз­лич­ных чётных де­ли­те­ля. В от­ве­те пе­ре­чис­ли­те най­ден­ные числа в по­ряд­ке воз­рас­та­ния.

Ответ:

Спрятать решение

Ре­ше­ние.

За­ме­тим, что, по­сколь­ку не­об­хо­ди­мо найти чётные де­ли­те­ли числа, можно не рас­смат­ри­вать нечётные числа из диа­па­зо­на. Если число чётное, то 1 чет­ный де­ли­тель у него уже есть, по­это­му пе­ре­мен­ную count будем объ­яв­лять со зна­че­ни­ем 1. На­хо­дя оче­ред­ной де­ли­тель числа, будем про­ве­рять, яв­ля­ет­ся ли этот де­ли­тель чётным, и, если яв­ля­ет­ся, будем при­бав­лять к пе­ре­мен­ной count еди­ни­цу. Также за­ме­тим, что у каж­до­го де­ли­те­ля числа есть пар­ный де­ли­тель  — если он чётный, будем при­бав­лять к пе­ре­ме­ной count еди­ни­цу. Также учтём то, что у числа может быть 2 оди­на­ко­вых де­ли­те­ля (на­при­мер, у числа 4 два оди­на­ко­вых де­ли­те­ля  — числа 2 и 2).

 

При­ведём ре­ше­ние на языке Pascal.

var

count, i, j: longint;

sqrtI: real;

begin

for i := 106000000 to 107000000 do begin

count := 1;

sqrtI := round(sqrt(i));

if i mod 2 = 0 then begin

for j := 2 to round(sqrt(i)) do begin

if i mod j = 0 then

if j mod 2 = 0 then count := count + 1;

if i mod j = 0 then

if (i div j) mod 2 = 0 then count := count + 1;

if (j * j = i) and (j mod 2 = 0) then count := count - 1;

if count > 3 then break;

end;

end;

if count = 3 then writeln(i);

count := 1;

end;

end.

В ре­зуль­та­те ра­бо­ты про­грам­ма долж­на вы­ве­сти сле­ду­ю­щее:

106084178

106492418

106784498

106842962

 

При­ведём ре­ше­ние на языке Python.

for i in range(106000000, 107000000 + 1):

count = 1

sqrtI = round(i ** 0.5)

if i % 2 == 0:

for j in range(2, sqrtI + 1):

if i % j == 0:

if j % 2 == 0:

count += 1

if i % j == 0:

if (i // j) % 2 == 0:

count += 1

if (j * j == i) and (j % 2 == 0):

count -= 1

if count > 3:

break

if count == 3:

print(i)

count = 1

 

При­ведём ре­ше­ние Клима Ор­ло­ва на языке Python.

def check(x):

k = 0

y = (x//2)

if y**0.5 == int(y**0.5):

z = y**0.5

for j in range(2,int(z**0.5)+1):

if z%j==0:

k += 1

break

if k == 0:

return True

else:

return False

 

for i in range(106000000,107000001,2):

if check(i) == True:

print(i)


Аналоги к заданию № 33527: 33770 35483 35914 Все

Раздел кодификатора ФИПИ: