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

Най­ди­те все на­ту­раль­ные числа, при­над­ле­жа­щие от­рез­ку [101 000 000; 102 000 000], у ко­то­рых ровно три раз­лич­ных чётных де­ли­те­ля (при этом ко­ли­че­ство нечётных де­ли­те­лей может быть любым). В от­ве­те пе­ре­чис­ли­те най­ден­ные числа в по­ряд­ке воз­рас­та­ния.

Ответ:

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

Ре­ше­ние.

За­ме­тим, что, по­сколь­ку не­об­хо­ди­мо найти чётные де­ли­те­ли числа, можно не рас­смат­ри­вать нечётные числа из диа­па­зо­на. Если число чётное, то 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=a_0 в сте­пе­ни левая круг­лая скоб­ка k_0 пра­вая круг­лая скоб­ка a_1 в сте­пе­ни левая круг­лая скоб­ка k_1 пра­вая круг­лая скоб­ка ...a_n в сте­пе­ни левая круг­лая скоб­ка k_n пра­вая круг­лая скоб­ка , тогда ко­ли­че­ство де­ли­те­лей числа m равно  левая круг­лая скоб­ка k_0 плюс 1 пра­вая круг­лая скоб­ка умно­жить на левая круг­лая скоб­ка k_1 плюс 1 пра­вая круг­лая скоб­ка ... левая круг­лая скоб­ка k_n плюс 1 пра­вая круг­лая скоб­ка . В част­но­сти, чет­ное число рас­кла­ды­ва­ет­ся на мно­жи­те­ли как 2 в сте­пе­ни левая круг­лая скоб­ка k_0 пра­вая круг­лая скоб­ка a_1 в сте­пе­ни левая круг­лая скоб­ка k_1 пра­вая круг­лая скоб­ка ...a_n в сте­пе­ни левая круг­лая скоб­ка k_n пра­вая круг­лая скоб­ка , где мно­жи­те­ли ai  — не­чет­ные числа. Тогда число имеет  левая круг­лая скоб­ка k_0 пра­вая круг­лая скоб­ка умно­жить на левая круг­лая скоб­ка k_1 плюс 1 пра­вая круг­лая скоб­ка умно­жить на левая круг­лая скоб­ка k_2 плюс 1 пра­вая круг­лая скоб­ка ... левая круг­лая скоб­ка k_n плюс 1 пра­вая круг­лая скоб­ка чет­ных де­ли­те­лей и  левая круг­лая скоб­ка k_1 плюс 1 пра­вая круг­лая скоб­ка умно­жить на левая круг­лая скоб­ка k_2 плюс 1 пра­вая круг­лая скоб­ка ... левая круг­лая скоб­ка k_n плюс 1 пра­вая круг­лая скоб­ка не­чет­ных.

По усло­вию за­да­чи тре­бу­ет­ся, чтобы число имело 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)


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

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