Найти максимальное кол-во и значение расположенных рядом одинаковых элементов массива.
Массив <= 10
Не могу дойти до алгоритма, по которому считать кол-во элементов выполняющих условие, так чтобы, если есть ряд длинней предыдущего, он считался заново и сохранить повторяющееся значение.
const
m= 30;
var
a: array[1..m] of integer;
i,s,x,l: integer;
begin
Randomize;
for i:=1 to m do a[i]:= Random(4);
for i:=1 to m do write(a[i]:2);
writeln;
s:= 1;
x:= s;
l:= 1;
for i:=2 to m do
if a[i]<>a[s] then begin
if i-s>l then begin
x:= s;
l:= i-s
end;
s:= i;
end;
writeln('longest sequence consists of ',l,' numbers ',a[x],', starting at ',x,' pos');
readln
end.
Логическая ошибка идёт.
Если в конце поставить, к примеру, подряд 4 одинаковых значения, выдаёт 2 значения подряд большее.
for i := 2 to m + 1 doесли поменять условия местами - вылет за пределы массива гарантирован.
if (i = m + 1) or (a[i] <> a[s]) then // именно в таком порядке, сначала условие i = m + 1
begin
Сделал. Идёт не просчёт 1 элемента
тоесть, если все элементы одинаковые то она даёт на 1 меньше. Сейчас проверю (я поменял вод данных (вод вручную не больше 10)). Это ведь не должно влиять на результат?
Добавлено через 12 мин.
НУ вот она:
program LongestNear;
const
m=10;
var
a: array[1..m] of integer;
i,s,x,l,N: integer;
begin
writeln('nahozhdenie samoj dlinoj cepochki povtorenij');
{Wwod masiva}
repeat
write('Zadajte chislo elementov v massive (1..',
m,') ');
readln(N);
if (N <= 0) or (N > m) then
writeln('vi oshiblis! Povtorite!');
until (N > 0) and (N <= m);
for i := 1 to N do
begin
write('Zadajte element N',i,' ');
readln(a[i])
end;
{nahozhdenie rezultata}
s:= l;
x:= s;
l:= l;
for i:= 2 to N+1 do
if (i=N+1) or (a[i]<>a[s]) then
begin
if i-s>l then
begin
x:= s;
l:= i-s
end;
s:= i;
end;
writeln('bolshee kol-vo elementov r9dom ',l,'element',a[x]);
end.
const
MaxSize = 10;
var
A: array [1..MaxSize] of Integer;
N: Integer;
I: Integer;
R: Integer;
V: Integer;
Z: Integer;
{ я пропустил ввод данных что бы лишнее не писать тут, а так он такой же как и тот что я чуть выше писал}
R:=0;
V:=0;
if N=1 then
begin
V:=1;
Z:=A[1];
end;
for I:=1 to N do
if (I>1) and (I<N) then
begin
if Z=A[I-1] then
R:=0;
if A[I]=A[I+1] then
R:=R+1
else
if (A[I]=A[I-1]) and (A[I]<>A[I+1]) then
begin
R:=R+1;
if V=0 then
begin
V:=R;
Z:=A[I]
end
else
if R>V then
begin
V:=R;
Z:=A[I];
end;
end;
end
else
begin
if (I=1) and (A[I]=A[I+1]) then
R:=R+1
else
if (I=N) and (A[I]=A[I-1]) then
begin
R:=R+1;
if R>V then
begin
V:=R;
Z:=A[I];
end;
end;
end;
{ Вывод результата}
writeln('Максимальная цепочка = ', V,' при значение = ',Z);
readln;
end.
const
m= 5;
var
a: array[1..m] of integer =
// (1, 1, 1, 1, 5, 2, 3, 6, 3, 3);
(1, 1, 1, 1, 1);
i,s,x,l: integer;
begin
// Randomize;
// for i:=1 to m do a[i]:= Random(4);
for i:=1 to m do
write(a[i]:2);
writeln;
s:= 1;
x:= s;
l:= 1;
for i := 2 to m + 1 do
if (i = m + 1) or (a[i] <> a[s]) then
begin
if i-s>l then
begin
x:= s;
l:= i-s
end;
s:= i;
end;
writeln('longest sequence consists of ',l,' numbers ',a[x],', starting at ',x,' pos');
readln
end.
1 1 1 1 1
longest sequence consists of 5 numbers 1, starting at 1 pos