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

Рас­смот­рим про­из­воль­ное на­ту­раль­ное число, пред­ста­вим его всеми воз­мож­ны­ми спо­со­ба­ми в виде про­из­ве­де­ния двух на­ту­раль­ных чисел и найдём для каж­до­го та­ко­го про­из­ве­де­ния раз­ность со­мно­жи­те­лей. На­при­мер, для числа 16 по­лу­чим: 16  =  16 · 1  =  8 · 2  =  4 · 4, мно­же­ство раз­но­стей со­дер­жит числа 15, 6 и 0. Най­ди­те все на­ту­раль­ные числа, при­над­ле­жа­щие от­рез­ку [2 000 000; 3 000 000], у ко­то­рых со­став­лен­ное опи­сан­ным спо­со­бом мно­же­ство раз­но­стей будет со­дер­жать не мень­ше трёх эле­мен­тов, не пре­вы­ша­ю­щих 115. В от­ве­те пе­ре­чис­ли­те най­ден­ные числа в по­ряд­ке воз­рас­та­ния.

Ответ:

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

Ре­ше­ние.

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

 

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

var

count, i, j: longint;

sqrtI: real;

begin

for i := 2000000 to 3000000 do begin

sqrtI := sqrt(i);

count := 0;

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

if (i mod j = 0) then begin

if (((i div j) - j) < 116) then

count := count + 1;

end;

end;

if count > 2 then writeln(i);

count := 0;

end;

end.

 

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

2053440

2098080

2328480

2638944

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

for i in range(2000000, 3000001):

sqrti = i**0.5

k = 0

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

if i % j == 0:

if (abs(i / j) - j) <= 115:

k += 1

if k > 2: print(i)

k = 0

 

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

def divisors(x):

div = []

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

if x % j == 0:

if (x // j) - j < 115:

div.append((x // j) - j)

return sorted(set(div))

for x in range(2000000, 3000000+1):

d = divisors(x)

if len(d) >= 3:

print(x)

 

При­ведём ре­ше­ние Артёма Гри­ди­на на языке С++.

#include

#include

int main()

{

int cnt = 0;

for (int n = 2000000; n <= 3000000; n++)

{

cnt = 0;

for (int i = 1; i < ceil(sqrt(n)); i++)

{

if (n % i == 0 && n / i - i <= 115)

cnt++;

if (cnt >= 3)

{

printf("%i\n", n);

break;

}

}

}

return 0;

}


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

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