Длина последовательности

Задача

 

Определить в массиве длину самого длинного ряда повторяющихся чисел.

Например.
Если массив таков: 2, 4, 4, 4, 8, 8, 9, 12, 12, 14, 16, 16, 85,
то искомое значение равно трем, т.к. самая длинная последовательность повторяющихся чисел состоит из трех четверок.

 

Решение

 

Алгоритм решения задачи: 

  1. Пусть значение элементов массива определяется случайным образом, с помощью функции random.
  2. Каждый элемент должен сравниваться со следующим за ним.
  3. Если элементы равны по значению, значит, счетчик количества одинаковых элементов должен увеличиться на единицу.
  4. Если последовательные элементы не равны, то должно произойти два действия: сравнение текущего значения счетчика с уже имеющимся максимальным значением и сброс текущего счетчика.
  5. После цикла for также требуется сравнить значение текущего значения счетчика с максимальным. Это делается на случай, если максимальной по длине оказывается последняя последовательность и в этом случае ветка else внутри for не «срабатывает».

Программа на языке Паскаль: 

 

const
    M = 20;
var
    arr: array[1..M] of integer;
    i, n, max, curr: integer;
 
begin
    randomize;
    for i := 1 to M do begin
        arr[i] := random(3) + 1;
        write(arr[i]:2)
    end;
 
    max := 1;
    curr := 1;
 
    for i := 1 to n - 1 do
        if arr[i] = arr[i+1] then
            curr := curr + 1
        else begin
            if curr > max then
                max := curr;
            curr := 1;
        end;
 
    if curr > max then
        max := curr;
 
    writeln;
    writeln (max);
 
readln
end.

 

Примечания: 

Данный код не работает так, как надо. Не срабатывает ветка if. Причина не установлена.

 

Тема

Одномерные массивы

Уровень

Сложные задачи

Комментарии

В 1 строке выбираете нужное кол-во элементов массива, а в 8 строке максимально возможный элемент.

const N=15;
var
a:array[1..N] of integer;
i,max,x:integer;
 begin
 randomize;
  for i:=1 to N do begin
   a[i]:=random(15);
   write(a[i],', ');
  end;
  max:=0;
  x:=1;
  for i:=1 to N-1 do begin
   if a[i]=a[i+1] then
    inc(x)
    else begin
     if x>max then begin
      max:=x;
      x:=1;
     end;
    end;
  end;
  writeln;
  writeln('Max:',max);
 end.

var
   a:array[1..100] of integer;
   k,n,max,i:integer;
begin
   readln(n);
   for i:=1 to n do
   begin
      a[i]:=random(5);
      write(a[i]:5);
   end;
 
   k:=1; max:=1;
 
   for i:=1 to n-1 do
   begin
      if a[i] = a[i+1] then inc(k)
      else
      begin
         if k>max then
         max:=k;
         k:=1;
      end;
   end;
   writeln;
   writeln(max);
end.

ПОСЛЕ КОДА:
MAX:=1;
CURR:=1;
ДОБАВИТЬ N:=M; И ВСЕ БУДЕТ РАБОТАТЬ!

Ответ на от Гость

Зачем лишнее? Просто в "for i := 1 to n - 1 do" вместо "n - 1" поставить "M - 1". И из переменных, кстати, n убрать. И все заработает, и ничего совсем уж лишнего.

Добавить комментарий