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

Назовём не­три­ви­аль­ным де­ли­те­лем на­ту­раль­но­го числа его де­ли­тель, не рав­ный еди­ни­це и са­мо­му числу. На­при­мер, у числа 6 есть два не­три­ви­аль­ных де­ли­те­ля: 2 и 3. Най­ди­те все на­ту­раль­ные числа, при­над­ле­жа­щие от­рез­ку [289123456; 389123456] и име­ю­щие ровно три не­три­ви­аль­ных де­ли­те­ля. Для каж­до­го най­ден­но­го числа за­пи­ши­те в от­ве­те его наи­боль­ший не­три­ви­аль­ный де­ли­тель. От­ве­ты рас­по­ло­жи­те в по­ряд­ке воз­рас­та­ния.

На­при­мер, в диа­па­зо­не [5; 16] ровно три раз­лич­ных на­ту­раль­ных де­ли­те­ля имеет число 16, по­это­му для этого диа­па­зо­на вывод на экра­не долж­на со­дер­жать сле­ду­ю­щие зна­че­ния:

16 8

Ответ:

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

Ре­ше­ние.

Если ре­шать за­да­чу пе­ре­бо­ром  — про­грам­ма будет су­ще­ствен­но не­эф­фек­тив­на по вре­ме­ни. За­ме­тим, что у каж­до­го де­ли­те­ля числа име­ет­ся пара, на­при­мер, пары де­ли­те­лей числа 16 будут вы­гля­деть так: 1 и 16, 2 и 8, 4 и 4, всего пять раз­лич­ных де­ли­те­лей. От­сю­да можно за­клю­чить, что имеет смысл пе­ре­би­рать воз­мож­ные де­ли­те­ли числа от еди­ни­цы до корня от са­мо­го числа и, на­хо­дя оче­ред­ной де­ли­тель, при­бав­лять к пе­ре­мен­ной numDel 2. Также за­ме­тим, что по­сколь­ку число долж­но иметь три не­три­ви­аль­ных де­ли­те­ля, можно рас­смат­ри­вать толь­ко числа, квад­рат­ной ко­рень из ко­то­рых равен це­ло­му числу. Также от­дель­но будем учи­ты­вать квад­рат­ный ко­рень числа, на­кап­ли­вая при этом в пе­ре­мен­ной numDel еди­ни­цу.

 

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

var

numDel, i, j: longint;

maxDel: longint;

sqrtI: real;

begin

for i := 289123456 to 389123456 do begin

sqrtI := sqrt(i);

numDel := 0;

if (round(sqrtI) = sqrtI) then begin

maxDel := 1;

for j := 1 to round(sqrtI) do

if (i mod j = 0) then begin

if (maxDel = 1) and (j <> 1) then maxDel := i div j;

if (j <> round(sqrtI)) then numDel := numDel + 2;

if (j * j = i) then numDel := numDel + 1;

end;

if numDel = 5 then writeln(i, ' ', maxDel);

end;

end;

end.

 

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

294499921 2248091

352275361 2571353

373301041 2685619

При­ведём дру­гое ре­ше­ние.

За­ме­тим, что ровно три не­три­ви­аль­ных де­ли­те­ля имеет число, из ко­то­ро­го можно из­влечь ко­рень четвёртой сте­пе­ни, причём по­лу­чив­ше­е­ся при этом число обя­за­тель­но долж­но быть про­стым.

 

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

var

i, del: integer;

control: boolean;

begin

del := 2;

i := round(power(289123456, 0.25));

while (power(i, 4) <= 389123456) do begin

while (i mod del <> 0) do begin

del := del + 1;

if (i < 3) or (del = i) then control := True

else control := False;

end;

if control then writeln(power(i, 4), ' ', power(i, 3));

i := i + 1;

del := 2;

control := False;

end;

end.

 

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

294499921 2248091

352275361 2571353

373301041 2685619

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

for i in range(289123456, 389123457):

sqrti = i**0.5

numdel = 0

if round(sqrti) == sqrti:

maxdel = 1

for j in range(2, round(sqrti) - 1):

if i % j == 0:

if maxdel == 1: maxdel = i // j

numdel += 2

if numdel == 2: print(i, maxdel)

 

При­ведём ре­ше­ние Ста­ни­сла­ва Сте­па­но­ва на языке Python.

for i in range(int(289_123_456 ** 0.25), int(389_123_456 ** 0.25)):

for j in range(2, i):

if not i % j: # Про­вер­ка на про­стое число

break

else:

print(i ** 4, i ** 3)

 

При­ведём ре­ше­ние Бо­ри­са Са­ве­лье­ва на языке Python.

for i in range(17004, 19726 + 1):

a = []

x=i*i

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

if x % j == 0:

a.append(j)

if j != (x // j):

a.append(x // j)

if len(a) > 3:

break

if len(a) == 3:

print(x, max(a))


Аналоги к заданию № 29673: 33104 Все

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