Pers.narod.ru. Алгоритмы. Самая длинная последовательность нулей |
Найти самую длинную последовательность из нулей в массиве A(i),i=1,2,..,N.
Единственный алгоритмически важный момент в подобных задачах - по возможности сократить число просмотров массива. Поскольку в данном случае у программы всего два состояния - внутри очередной цепочки нулей и вне её, то всё можно сделать за один проход по массиву.
program Nulls; uses crt; const size=1000; {Максимальный размер массива} var a:array [1..size] of integer; {Массив} n,len,maxlen,i:integer; {реальная размерность,длина последовательности, макс.длина,счетчик} in0:boolean; {Признак того, что мы внутри последовательности нулей} begin ClrScr; {Очистили экран} repeat Writeln; Write ('Введите размерность массива (от 2 до ',size, '):'); Readln (n); until (n>1) and (n<=size); {Ввод правильной размерности} writeln ('Генерирую массив из ',n,' элементов...'); delay (500); {Задержка полсекунды} for i:=1 to n do a[i]:=Random(2); {Random(2) вернет 0 или 1} writeln ('Считаю длину последовательности...'); delay (500); len:=0; maxlen:=0; in0:=false; for i:=1 to n do begin if (a[i]=0) then begin {Нашли нулевой элемент} if (in0) then begin {Если внутри последовательности} len:=len+1; {то увеличить на 1 ее длину} if len>maxlen then maxlen:=len; {и сравнить с максимальной длиной} end else begin {иначе} len:=1; {войти внутрь последовательности} in0:=true; end; end else begin {Ненулевой элемент} len:=0; {сбросить длину последовательности} in0:=false; {сбросить признак того, что мы внутри посл.-сти} end; end; Writeln ('Последовательность чисел:'); for i:=1 to n do write (a[i]:2); Writeln; Writeln ('Максимальная длина последовательности нулей=',maxlen); end.
В случаях, когда нужно найти самую длинную последовательность одинаковых элементов массива независимо от их значений, помочь может такая программа:
{Самая длинная последовательность одинаковых элементов} {Выводится длина цепочки элементов и значение элемента} const N=6; const a:array [1..N] of integer =( 2,1,3,5,4,4 ); var i,len,maxlen,pos:integer; begin {Поиск самой длинной цепочки} len:=1; maxlen:=0; for i:=1 to n-1 do if a[i]=a[i+1] then begin inc (len); if len>maxlen then begin pos:=i; maxlen:=len; end; end else len:=1; writeln (' maxlen=',maxlen); writeln (' item=',a[pos]); reset(input); readln; end.
гостевая; E-mail |