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

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

Ответ:

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

Ре­ше­ние.

Решим за­да­чу пе­ре­бо­ром. Сге­не­ри­ру­ем числа, под­хо­дя­щие под усло­вия за­да­чи. Мас­сив arr2 за­пол­ним чис­ла­ми, ко­то­рые яв­ля­ют­ся чётными сте­пе­ня­ми двой­ки, то есть 20, 22, 24 и так далее. А мас­сив arr3 за­пол­ним чис­ла­ми, ко­то­рые яв­ля­ют­ся нечётными сте­пе­ня­ми трой­ки, то есть 31, 33, 35 и так далее. Те­перь будем по­сле­до­ва­тель­но пе­ре­мно­жать эле­мен­ты мас­си­вов arr2 и arr3 и ис­кать такие ре­зуль­та­ты про­из­ве­де­ния, ко­то­рые будут ле­жать в от­рез­ке [400 000 000; 600 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]) >= 400000000) and ((arr2[i] * arr3[j]) <= 600000000) 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.

 

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

408146688

452984832

516560652

573308928

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

Будем де­лить каж­дое число из за­дан­но­го диа­па­зо­на на 2 до тех пор, пока это воз­мож­но, а затем на 3. Таким об­ра­зом, мы опре­де­лим зна­че­ния пе­ре­мен­ных m и n. Если m  — чет­ное, n  — не­чет­ное, а ре­зуль­тат де­ле­ния равен 1, то число вы­во­дит­ся на экран.

var i,j,m,n:longint;

begin

for j:=400000000 to 600000000 do begin

   i:=j;

   m:=0;

   n:=0;

   while i mod 2 = 0 do begin

      i:=i div 2;

      m:=m+1;

      end;

   if (m mod 2 = 0) then begin

      while i mod 3 = 0 do begin

         i:=i div 3;

         n:=n+1;

         end;

      if (n mod 2 <> 0) and (i=1) then writeln(j);

      end;

end;

end.

 

За­ме­тим, что время ра­бо­ты дан­ной про­грам­мы можно умень­шить на ос­но­ве сле­ду­ю­щих со­об­ра­же­ний. Если число де­лит­ся на чет­ную сте­пень двой­ки, зна­чит, оно де­лит­ся на не­ко­то­рую сте­пень чет­вер­ки, по­это­му число можно де­лить не на 2, а на 4. Если число де­лит­ся на 4 и 3, то оно де­лит­ся на 12, зна­чит, можно пе­ре­би­рать толь­ко числа, крат­ные 12, начав пе­ре­бор с числа 400 000 008. По­лу­чим сле­ду­ю­щую про­грам­му:

 

var i,j,m,n,k:longint;

begin

j:=40000008;

repeat

   i:=j;

   k:=0;

   n:=0;

   while i mod 4=0 do begin

      i:=i div 4;

      k:=k+1;

      end;

   if k>0 then begin

      while i mod 3 = 0 do begin

         i:=i div 3;

         n:=n+1;

         end;

      if (n mod 2 <> 0) and (i=1) then writeln(j);

      end;

   j:=j+12;

   until j>=600000000;

end.

 

 

При­ведём дру­гое ре­ше­ние Бо­го­лю­бо­ва Ивана на языке Pascal.

var

p:biginteger;

count,m,n:integer;

begin

count:=0;

for m:=2 to 28 do

if (m mod 2)=0 then begin

for n:=1 to 18 do

if (n mod 2)<>0 then begin

p:=biginteger.Pow(2,m)*biginteger.Pow(3,n);

if (p>=400000000) and (p<=600000000) then begin

inc(count);

println(p);

end;

end;

end;

end.

 

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

for j in range(400000000, 600000000 + 1):

i = j

m = 0

n = 0

while i % 2 == 0:

i //= 2

m += 1

if m % 2 == 0:

while i % 3 == 0:

i //= 3

n += 1

if n % 2 != 0 and i == 1:

print(j)

 

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

a=[]

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

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

x = 2**m * 3**n

if 400000000<= x <=600000000:

a.append(x)

print(*sorted(a))

 

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

nums = [2**m*3**n for m in range(0,30,2) for n in range(1,30,2) if 400000000 <= 2**m*3**n <= 600000000]

for n in sorted(nums): print(n)


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

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