Program MashaLukianova; uses crt; const n=12; var mas:array[1..n] of integer; b,i,left,right,temp:integer; begin writeln('*** alphaues is thinking... ***'); writeln('*** OK ***'); writeln(); write('Введите загадочное число B '); readln(b); writeln('Элементы массива:'); {создание и вывод начального массива} randomize; for i:=1 to n do begin mas[i]:=random(100)-50; write (mas[i]:4); end; writeln(); left:=0; right:=n; while left <> right do {просматриваем массив с концов к середине, пока "левый" и "правый" текущие элементы не встретятся} begin if mas[left+1]<=b then
{если текущий "левый" элемент меньше или равно В, то просто идём смотреть следующий } begin left:=left+1; end else if mas[right]>=b then {если текущий "правый" элемент больше или равно В, то просто идём смотреть следующий }
begin right:=right-1; end else
{иначе меняем "левый" и "правый" местами} begin temp:= mas[left+1]; mas[left+1]:=mas[right]; mas[right]:=temp; left:=left+1; right:=right-1; end; end; writeln(); {вывод массива-результата} for i:=1 to n do begin write (mas[i]:4); end; writeln(); end.
Приведём все степени к основанию 2
2^3702-2^468+2^1620-108
-108 можно представить как -128 + 16 + 4
2^3702-2^468+2^1620-2^7 + 2^4 + 2^2
Теперь выстраиваем степени в порядке убывания:
2^3702+2^1620-2^468-2^7 + 2^4 + 2^2
В выражении два вычитания подряд, избавимся от этого, заменив -2^468 на -2^469 + 2^468
2^3702+2^1620 -2^469+2^468-2^7 + 2^4 + 2^2
2^3702 - 1 единица
2^4 - 1 единица
2^2 - 1 единица
Количество единиц в вычитаниях будет равно разнице степеней. Например 1000000-100=1111
2^1620 -2^469 - количеств единиц 1620-469 = 1151
2^468-2^7 - количество единиц 468-7 = 461
Общее количество единиц равно 3+1151+461 = 1615
Program MashaLukianova;
uses crt;
const n=12;
var
mas:array[1..n] of integer;
b,i,left,right,temp:integer;
begin
writeln('*** alphaues is thinking... ***');
writeln('*** OK ***');
writeln();
write('Введите загадочное число B ');
readln(b);
writeln('Элементы массива:');
{создание и вывод начального массива}
randomize;
for i:=1 to n do
begin
mas[i]:=random(100)-50;
write (mas[i]:4);
end;
writeln();
left:=0;
right:=n;
while left <> right do {просматриваем массив с концов к середине, пока "левый" и "правый" текущие элементы не встретятся}
begin
if mas[left+1]<=b then
{если текущий "левый" элемент меньше или равно В, то просто идём смотреть следующий }
begin
left:=left+1;
end
else
if mas[right]>=b then
{если текущий "правый" элемент больше или равно В, то просто идём смотреть следующий }
begin
right:=right-1;
end
else
{иначе меняем "левый" и "правый" местами}
begin
temp:= mas[left+1];
mas[left+1]:=mas[right];
mas[right]:=temp;
left:=left+1;
right:=right-1;
end;
end;
writeln();
{вывод массива-результата}
for i:=1 to n do
begin
write (mas[i]:4);
end;
writeln();
end.