Линейный целочисленный массив размером n заполнен только нулями и единицами в произвольном порядке.вам следует переместитьэлементы так,чтобы в начале массива были нули ,а затем единицы.
// PascalABC.NET 3.0, сборка 1160 от 05.02.2016 begin var a:=ArrRandom(ReadInteger('n='),0,1); a.Println; var k:=a.Where(x->x=0).Count; a:=SeqFill(k,0).Concat(SeqFill(a.Length-k,1)).ToArray; a.Println end.
PascalABC.NET 3.4.0, сборка 1671 от 31.05.2018 Внимание! Если программа не работает, обновите версию!
begin var St:=new Stack<integer>; foreach var k in ReadSeqInteger('Вводите данные:',ReadInteger('n=')) do St.Push(k); St.Println; // исходное содержимое стека var St1:=new Stack<integer>; var min:=MaxInt; var k:integer; while St.Count>0 do begin k:=St.Pop; if Abs(k)<min then min:=Abs(k); St1.Push(k); end; while St1.Count>0 do begin k:=St1.pop; if Abs(k)<>min then St.Push(k) end; St.Println end.
Вот правильно отформатированный код. Пока код не отформатирован, понять его очень сложно, поэтому программисты всегда сразу пишут код с необходимым форматированием. Начинающим писать программы тоже необходимо всегда следовать этому же принципу.
if (a[h,v]=0) or (a[h-1,v]<>0) then eng+=1; if a[h,v]<>0 then if a[h-1,v]=0 then begin a[h-1,v]:=a[h,v]; a[h,v]:=0; end;
Наличие переменных вида a[h,v] позволяет сделать вывод, что фрагмент программы что-то делает с элементами двумерного массива "а". При этом, эдементы все время встречаются парами вида a[h,v] и a[h-1,v]. Если a[h,v] - некий текущий элемент в строке h и столбце v, то a[h-1,v] - это элемент в предыдущей строке и том же столбце. Для краткости будем называть элемент a[h,v] ТЕКУЩИЙ, а элемент a[h-1,v] - ПРЕДШЕСТВУЮЩИЙ, предполагая просмотр по столбцам. Теперь фрагмент программы можно заменить псевдокодом.
ЕСЛИ (ТЕКУЩИЙ=0) ИЛИ (ПРЕДШЕСТВУЮЩИЙ≠0) ТО eng+=1; (1) ЕСЛИ ТЕКУЩИЙ≠0 ТО (2) ЕСЛИ ПРЕДШЕСТВУЮЩИЙ=0 ТО (3) ПРЕДШЕСТВУЮЩИЙ:=ТЕКУЩИЙ; (4) ТЕКУЩИЙ:=0; (5)
Опреатор eng+=1 - более короткая запись оператора eng:=eng+1, допустимая только в версии PascalABC.NET и пришедшая в него из языка C#. Это действие обычно называют "плюс единичка в счетчик", подразумевая, что eng подсчитывает количество некоторых событий. В данном случае это событие - случай, когда или ТЕКУЩИЙ элемент нулевой, или ПРЕДШЕСТВУЮЩИЙ ненулевой.
Сделаем псевдокод более компактным.
ЕСЛИ (ТЕКУЩИЙ=0) ИЛИ (ПРЕДШЕСТВУЮЩИЙ≠0) ТО (1) ДОБАВИМ 1 В СЧЕТЧИК ТАКИХ СОБЫТИЙ (2) ЕСЛИ ТЕКУЩИЙ≠0 ТО (3) ЕСЛИ ПРЕДШЕСТВУЮЩИЙ=0 ТО (4) ПРЕДШЕСТВУЮЩИЙ:=ТЕКУЩИЙ; ТЕКУЩИЙ:=0; (5)
Условие (4) проверяется только если выполняется условие (3). Это оптимизация кода, которая позволяет не проверять условие (4), если условие (3) не выполняется. Такая оптимизация полезна только для старых компиляторов, а PascalABC.NET умеет оптимизировать подобные вещи сам. Для понимания алгоритма вопрос оптимизации несущественен, поэтому мы можем утверждать, что (5) выполнятнся только при одновременном наступлении (3) И (4).
ЕСЛИ (ТЕКУЩИЙ=0) ИЛИ (ПРЕДШЕСТВУЮЩИЙ≠0) ТО ДОБАВИМ 1 В СЧЕТЧИК ТАКИХ СОБЫТИЙ ЕСЛИ (ТЕКУЩИЙ≠0) И (ПРЕДШЕСТВУЮЩИЙ=0) ТО ПРЕДШЕСТВУЮЩИЙ:=ТЕКУЩИЙ; ТЕКУЩИЙ:=0
В последней строке отметим, что ПРЕДШЕСТВУЮЩИЙ принимает значение ТЕКУЩИЙ, а ТЕКУШИЙ обнуляется. Но это происходит только если ПРЕДШЕСТВУЮЩИЙ был нулём, следовательно можно говорить об обмене значениями.
ЕСЛИ (ТЕКУЩИЙ=0) ИЛИ (ПРЕДШЕСТВУЮЩИЙ≠0) ТО ДОБАВИМ 1 В СЧЕТЧИК ТАКИХ СОБЫТИЙ ЕСЛИ (ТЕКУЩИЙ≠0) И (ПРЕДШЕСТВУЮЩИЙ=0) ТО ОБМЕНЯТЬ ЗНАЧЕНИЯ ПРЕДШЕСТВУЮЩЕГО И ТЕКУЩЕГО
begin
var a:=ArrRandom(ReadInteger('n='),0,1); a.Println;
var k:=a.Where(x->x=0).Count;
a:=SeqFill(k,0).Concat(SeqFill(a.Length-k,1)).ToArray;
a.Println
end.
Тестовое решение:
n= 15
0 0 1 1 0 0 1 0 0 1 0 0 1 1 1
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1