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

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

На­при­мер, в диа­па­зо­не [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 := 123456789 to 223456789 do begin

sqrtI := sqrt(i);

numDel := 0;

if (round(sqrtI) = sqrtI) then begin

maxDel := 1;

for j := 2 to round(sqrtI) - 1 do begin

if (i mod j = 0) then begin

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

numDel := numDel + 2;

end;

end;

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

end;

end;

end.

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

131079601 1225043

141158161 1295029

163047361 1442897

 

При­ме­ча­ние.

Дру­гой спо­соб ре­ше­ния пред­став­лен в за­да­че 33104.

 

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

maxi = 0

for i in range(123456789, 223456790):

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.

import math

i = int(math.sqrt(123456789))+1

j=i*i

while j <= 223456789:

n = 0

d = 0

for k in range(2,i):

if j%k == 0:

n = n+1

d = j//k

if n>1: break

if n == 1:

print(j,d)

i = i+1

j = i*i

 

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

import math

a = 123456789

b = 223456789

for i in range(int(a ** 0.25), int(b ** 0.25) + 1):

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

if not i % j:

break

else:

if i > 1:

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

 

При­ведём ре­ше­ние Ми­ха­и­ла Глин­ско­го на языке Python.

for x in range(123456789,223456789+1 ):

if (x**0.5) == round(x**0.5):

m = set()

for i in range(2,round(x**0.5)+1):

if x%i==0:

m.add(i)

m.add(x//i)

if len(m)>3: break

if len(m) == 3:

print(x,max(m))

 

 

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

for k in range (round(123456789**0.5),round(223456789*0.5+1)):

a = []

i = k**2

if k*k == i:

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

if i%j==0:

a.append(j)

if j != (i//j):

a.append(i//j)

if len(a) == 3:

print(i,max(a))

 

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

# Число, име­ю­щее 5 раз­лич­ных де­ли­те­лей (т. е. 3 не­три­ви­аль­ных де­ли­те­ля),

# долж­но иметь вид p**4, где p - про­стое число.

# Де­ли­те­ли: 1, p, p**2, p**3, p**4

def prostoe(n):

k = 2

while k*k <= n:

if n%k == 0:

return False

k += 1

return True

for n in range(int(123456789**0.25),int(223456789**0.25)+1):

if prostoe(n): print(n**4,n**3)


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

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