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

Най­ди­те все на­ту­раль­ные числа, при­над­ле­жа­щие от­рез­ку [45 000 000; 50 000 000], у ко­то­рых ровно пять раз­лич­ных нечётных де­ли­те­лей (ко­ли­че­ство чётных де­ли­те­лей может быть любым). В от­ве­те пе­ре­чис­ли­те най­ден­ные числа в по­ряд­ке воз­рас­та­ния.

Ответ:

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

Ре­ше­ние.

Решим за­да­чу пе­ре­бо­ром. На­хо­дя оче­ред­ной де­ли­тель числа, будем про­ве­рять, яв­ля­ет­ся ли этот де­ли­тель нечётным, и, если яв­ля­ет­ся, будем при­бав­лять к пе­ре­мен­ной count еди­ни­цу. Также за­ме­тим, что у каж­до­го де­ли­те­ля числа есть пар­ный де­ли­тель  — если он нечётный, будем при­бав­лять к пе­ре­ме­ной count еди­ни­цу. Также учтём то, что у числа может быть 2 оди­на­ко­вых де­ли­те­ля (на­при­мер, у числа 9 два оди­на­ко­вых де­ли­те­ля  — числа 3 и 3).

 

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

var

count, i, j, k, sqrtI: longint;

begin

for i := 45000000 to 50000000 do begin

count := 0;

sqrtI := round(sqrt(i));

for j := 1 to sqrtI do begin

if i mod j = 0 then begin

if j mod 2 = 1 then count := count + 1;

k := i div j;

if k mod 2 = 1 then begin

count:=count + 1;

if j = k then count:=count - 1;

end;

end;

if count > 5 then break;

end;

if count = 5 then writeln(i);

end;

end.

 

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

45212176

45265984

47458321

48469444

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

Дру­гой спо­соб ре­ше­ния, тре­бу­ю­щий мень­ше вре­ме­ни для ра­бо­ты про­грам­мы, при­ве­ден в за­да­че 35483.

 

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

## uses school;

for var i:=45000000 to 50000000 do

if i.Divisors.Count(n -> n mod 2=1)=5 then println(i)

 

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

def f1(x):

while x%2==0:

x=x//2

if (x**0.25) == int(x**0.25):return True

else:return False

def f(x):

k=2

deliteli=set()

if x%2!=0:deliteli.add(x)

deliteli.add(1)

while k*k<=x:

if x%k==0:

if k%2!=0:deliteli.add(k)

if x//k<x:

if (x//k)%2!=0:deliteli.add(x//k)

k=k+1

return sorted(deliteli)

start=45000000

end=50000000

numbers=[int(x) for x in range(start,end+1) if f1(x)==True]

for i in numbers:

if len(f(i))==5:

print(i)

 

При­ведём ре­ше­ние Ви­та­са Ре­мей­ки­са на языке Python.

primes = set()

def prime(n):

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

if n % i == 0:

return False

return True

for i in range(3, int(50000000**0.25) + 1):

if prime(i):

primes.add(i)

for i in range(45000000, 50000001):

p = i

while p % 2 == 0:

p //= 2

if int(p**0.25) in primes and (int(p**0.25))**4 == p:

print(i)

 

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

def kd(p):

a = []

z = 1

while p % 2 == 0:

p = p//2

if (p ** 0.25) == int(p ** 0.25):

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

if p % i == 0:

if i % 2 == 1:

a.append(i)

if (p//i) % 2 == 1:

a.append(p//i)

if len(a) >= 4:

break

z = len(set(a)) + 1

if p % 2 == 1:

z += 1

return z

for i in range(45000000,50000001):

if kd(i) == 5:

print(i)

 

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

def isprime(n):

k = 2

while k**2 <= n:

if n%k==0: return False

k += 1

return True

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

a = [p**4*2**n for p in range(3,100,2) for n in range(0,30) if isprime(p)]

b = sorted([x for x in a if 45000000<=x<=50000000])

for x in b:

print(x)

 

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

L,R=45_000_000,50_000_000

def P(n):return n>2 and all(n%i for i in range(3,int(n**.5)+1,2))

s={x for p in range(3,200,2) if P(p) for x in [p**4*(1<print(*sorted(s))


Аналоги к заданию № 33527: 33770 35483 35914 Все

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