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

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

Ответ:

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

Ре­ше­ние.

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

 

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

var

count, i, j: longint;

sqrtI: real;

begin

for i := 1000000 to 2000000 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) < 101) then

count := count + 1;

end;

end;

if count > 2 then writeln(i);

count := 0;

end;

end.

 

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

 

for i in range(1000000, 2000001):

c = 0

for d in range(int(i ** (0.5)), 899, -1):

if(i % d == 0):

if(abs(i / d - d) <= 100):

c += 1

if c > 2:

print(i)

break

 

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

1113840

1179360

1208844

1499400

 

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

for i in range (1000000,2000000+1):

a = []

k = int(i**0.5)+1

for j in range (1,k):

if i%j==0:

if ((i//j)-j)<=100:

a.append((i//j)-j)

if len(a) >= 3:

print(i)

 

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

def difs(n):

d = []

k=int(n**0.5) - 55 # не­боль­шой запас

while k**2 <= n:

if n%k == 0: d.append(n//k - k)

k += 1

return len([x for x in d if x <= 100])

for n in range(1000000,2000001):

if difs(n) >= 3: print(n)


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

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