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

Най­ди­те все на­ту­раль­ные числа N, при­над­ле­жа­щие от­рез­ку [200 000 000; 400 000 000], ко­то­рые можно пред­ста­вить в виде N  =  2m · 3n, где m  — чётное число, n  — нечётное число. В от­ве­те за­пи­ши­те все най­ден­ные числа в по­ряд­ке воз­рас­та­ния.

Ответ:

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

Ре­ше­ние.

Решим за­да­чу пе­ре­бо­ром. Сге­не­ри­ру­ем числа, под­хо­дя­щие под усло­вия за­да­чи. Мас­сив arr2 за­пол­ним чис­ла­ми, ко­то­рые яв­ля­ют­ся чётными сте­пе­ня­ми двой­ки, то есть 20, 22, 24 и так далее. А мас­сив arr3 за­пол­ним чис­ла­ми, ко­то­рые яв­ля­ют­ся нечётными сте­пе­ня­ми трой­ки, то есть 31, 33, 35 и так далее. Те­перь будем по­сле­до­ва­тель­но пе­ре­мно­жать эле­мен­ты мас­си­вов arr2 и arr3 и ис­кать такие ре­зуль­та­ты про­из­ве­де­ния, ко­то­рые будут ле­жать в от­рез­ке [200 000 000; 400 000 000], эти числа будем за­пи­сы­вать в мас­сив answer. После на­хож­де­ния всех воз­мож­ных чисел, удо­вле­тво­ря­ю­щих усло­вию за­да­чи, от­сор­ти­ру­ем мас­сив answer по воз­рас­та­нию и вы­ве­дем на экран все эле­мен­ты этого мас­си­ва, от­лич­ные от нуля.

 

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

var

arr2: array[1..30] of int64;

arr3: array[1..20] of int64;

answer: array[1..100] of int64;

t: int64;

i, j, k: integer;

begin

arr2[1] := 1;

arr3[1] := 3;

for i := 1 to 100 do answer[i] := 0;

for i := 1 to 29 do arr2[i+1] := arr2[i] * 2 * 2;

for i := 1 to 19 do arr3[i+1] := arr3[i] * 3 * 3;

for i := 1 to 30 do

for j := 1 to 20 do begin

if ((arr2[i] * arr3[j]) >= 200000000) and ((arr2[i] * arr3[j]) <= 400000000) then

for k := 1 to 100 do

if answer[k] = 0 then begin

answer[k] := arr2[i] * arr3[j];

break;

end;

end;

for i := 1 to 100 do

for j := i + 1 to 100 do

if answer[i] > answer[j] then begin

t := answer[i];

answer[i] := answer[j];

answer[j] := t;

end;

for k := 1 to 100 do

if answer[k] <> 0 then writeln(answer[k]);

end.

 

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

201326592

229582512

254803968

322486272

При­ве­дем ре­ше­ние Ан­то­на Бо­ри­со­ва.

За­ме­тим, что числа m и n не пре­вы­ша­ют 30, по­сколь­ку 230 > 1 000 000 000. Будем пе­ре­би­рать числа от 0 до 30, пе­ре­мно­жать со­от­вет­ству­ю­щие сте­пе­ни двоек и троек и про­ве­рять, по­па­ло ли про­из­ве­де­ние в за­дан­ный диа­па­зон. Для воз­ве­де­ния числа в про­из­воль­ную сте­пень ис­поль­зо­ва­на функ­ция exp.

var

e : real;

m, n : integer;

begin

for m := 0 to 30 do begin

for n := 1 to 30 do begin

if ((m mod 2) = 0) and ((n mod 2) = 1) then begin

e := (exp(ln(2)*m))*(exp(ln(3)*n));

if (e >= 200000000.0) and ( e <= 400000000.0) then writeln(e);

end;

end;

end;

end.

 

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

for m in range(0, 31, 2):

for n in range(1, 19, 2):

if(200000000 <= 2 ** m * 3 ** n <= 400000000):

print(2 ** m * 3 ** n)

 

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

a=sorted([2**m*3**n for m in range(0,32,2) for n in range(1,32,2)])

for y in [x for x in a if 200000000 <= x <= 400000000]: print(y)


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

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