Задания
Версия для печати и копирования в MS Word
Тип 25 № 40741
i

Пусть M(N)  — сумма двух наи­боль­ших раз­лич­ных на­ту­раль­ных де­ли­те­лей на­ту­раль­но­го числа N, не счи­тая са­мо­го числа. Если у числа N мень­ше двух таких де­ли­те­лей, то M (N) счи­та­ет­ся рав­ным 0.

Най­ди­те 5 наи­мень­ших на­ту­раль­ных чисел, пре­вы­ша­ю­щих 10 000 000, для ко­то­рых 0 < M (N) < 10 000. В от­ве­те за­пи­ши­те най­ден­ные зна­че­ния M (N) в по­ряд­ке воз­рас­та­ния со­от­вет­ству­ю­щих им чисел N.

Ответ:

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

Ре­ше­ние.

Будем по­сле­до­ва­тель­но рас­смат­ри­вать каж­дое целое число, боль­шее 10 000 000. В каж­дом таком числе будем на­хо­дить наи­боль­шие 2 на­ту­раль­ных де­ли­те­ля, скла­ды­вая их. Если сумма пер­вых двух наи­боль­ших на­ту­раль­ных де­ли­те­лей числа будет мень­ше 10 000, будем вы­во­дить эту сумму на экран.

 

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

var

i, j, halfI, del: int64;

countDel, count: integer;

begin

count := 0;

i := 10000001;

while (count < 5) do begin

halfI := i div 2;

del := 0;

countDel := 0;

for j := halfI downto 2 do

if (i mod j = 0) then begin

countDel := countDel + 1;

del := del + j;

if del > 10000 then break

else if countDel = 2 then begin

writeln(del);

count := count + 1;

break;

end;

end;

i := i + 1;

end;

end.

 

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

6876

6374

6924

8024

8358

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

count = 0

i = 10000001

while count < 5:

halfI = i // 2

dell = 0

countDel = 0

for j in range(halfI, 1, -1):

if i % j == 0:

countDel += 1

dell += j

if dell > 10000:

break

elif countDel == 2:

print(dell)

count += 1

break

i += 1

 

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

def delit(n):

d = []

k = 2 # или 1 для задач, где тре­бу­ют­ся де­ли­те­ли 1 и n

while k**2 <= n:

if n%k == 0:

d.append(k)

if n//k != k:

d.append(n//k)

k += 1

return d

def m(n):

d=delit(n)

if len(d) < 2:

return 0

else:

d.sort()

return d[-1] + d[-2]

k = 0

n = 10000001

while k<5:

mn = m(n)

if 0 < mn < 10000:

k += 1

print(mn)

n += 1

 

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

cnt=1

for i in range (10**7+1,10**18+1):

k=int(i**0.5)

a=[]

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)>=2:

a.sort()

if (a[-1]+a[-2])<10000:

print(a[-1]+a[-2])

cnt+=1

if cnt==6:

break

 


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