Найти максимальное кол-во и значение расположенных рядом одинаковых элементов массива. Массив <= 10
Не могу дойти до алгоритма, по которому считать кол-во элементов выполняющих условие, так чтобы, если есть ряд длинней предыдущего, он считался заново и сохранить повторяющееся значение.
Lapp
9.04.2012 5:31
Цитата(Shtraf @ 9.04.2012 0:54)
дойти до алгоритма, по которому считать кол-во элементов выполняющих условие, так чтобы, если есть ряд длинней предыдущего, он считался заново и сохранить повторяющееся значение.
Как-то так:
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.
Shtraf
9.04.2012 18:45
Логическая ошибка идёт. Если в конце поставить, к примеру, подряд 4 одинаковых значения, выдаёт 2 значения подряд большее.
IUnknown
9.04.2012 19:14
Цитата
Если в конце поставить, к примеру, подряд 4 одинаковых значения
этот вариант приведенным выше кодом не охватывается. Завершающая последовательность не проверяется, т.к. условие a[ i ] <> a[s] не выполняется. Исправить можно так:
for i := 2 to m + 1 do if (i = m + 1) or (a[i] <> a[s]) then // именно в таком порядке, сначала условие i = m + 1 begin
если поменять условия местами - вылет за пределы массива гарантирован.
Shtraf
9.04.2012 20:04
Сделал. Идёт не просчёт 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.
Добавлено через 6 мин. Пример: если N=5 a[1]=a[2]=a[3]=a[4]=a[5]=4 цепочка = 4 значение 4
Shtraf
9.04.2012 21:22
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.
Вот то что я сотворил... но я делал на том что знаю (while я не умею им пользоваться у меня с ним не получилось)
Добавлено через 10 мин. В принципе вопрос исчерпан, но буду очень рад советам, потому что я только начал осваивать всё это.
IUnknown
9.04.2012 23:04
Цитата
Сделал. Идёт не просчёт 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
. Если бы давало неправильный результат - я бы, наверное, не стал отвечать на форуме?
Аналогично:(Показать/Скрыть)
const m = 10; var a : array[1..m] of integer; i, s, x, l: integer; n: integer; begin write('n = '); readln(n); for i := 1 to n do begin write('a[', i:2, '] = '); readln(a[i]); end;
for i:=1 to n do write(a[i]:2); writeln; s:= 1; x:= s; l:= 1; 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('longest sequence consists of ',l,' numbers ',a[x],', starting at ',x,' pos'); readln end.