Код на Паскале ниже создает массив из двадцати элементов. Затем находит самую длинную последовательность из нулей и выводит на экран ее длину и номер ее начала в массиве.
Рассмотрим код программы.
Очевидно, нам требуются переменные для хранения размера самой длинной последовательности нулей массива (len_max) и номера первого элемента этой последовательности (start).
При просмотре массива находится очередная последовательность нулей. Ее длина должна быть сохранена для последующего сравнения с самой длинной последовательностью, найденной до этого. Поэтому вводится еще одна переменная для хранения длины текущей серии последовательных нулей (len_ser).
Всем трем переменным сначала присваивается 0. Что означает, что никаких искомых последовательностей в массиве нет.
Далее массив просматривается поэлементно (в цикле for).
Если значение очередного элемента равно нулю, то длина текущей серии увеличивается. Иначе (когда значение очередного элемента не равно нулю), необходимо проверить, что содержится в переменной len_ser. Если перед этим была серия из нулей и длина этой серии оказалась больше значения len_max, то требуется обновить значение len_max и вычислить значение начала текущей максимальной последовательности нулей (start).
Также нужно обнулить значение len_ser, независимо от того произошла перезапись len_max или нет. Ведь предыдущая последовательность все равно закончилась.
Во внешнюю ветку if вложена еще одна инструкция if (в которую вложена еще одна ветка if).
if i = n then
if len_ser > len_max then begin
len_max := len_ser;
start := i - len_ser
end
Этот код необходим для того, чтобы учитывать последний элемент. Если его значение 0, то обработка этой серии не будет завершена, т.к. ветка else уже не сработает. Поэтому его учет надо произвести отдельно.
const n = 20; var arr: array[1..n] of 0..1; i, len_max, len_ser, start: byte; begin writeln('Массив: '); randomize; for i := 1 to n do begin arr[i] := random(2); write(arr[i]:2); end; writeln; len_max := 0; len_ser := 0; start := 0; for i := 1 to n do if arr[i] = 0 then begin len_ser := len_ser + 1; if i = n then if len_ser > len_max then begin len_max := len_ser; start := i - len_ser end end else begin if len_ser > len_max then begin len_max := len_ser; start := i - len_ser end; len_ser := 0 end; writeln('Длина максимальной серии: ',len_max); writeln('Начинается с ', start, '-й позиции'); readln end.
Комментарии
Подскажите,пожалуйста,как будет выглядеть программа если:
Если нужно определить самую длинную серию одинаковых элементов и указать из каких элементов она состоит?
определить самую длинную серию одинаковых элементов
Такая же задача. Удалена. Решение немного отличается. Сравнить
Найти в массиве самую длинную последовательность, состоящую из одинаковых элементов. Вывести на экран количество элементов самой длиной последовательности и номер элемента, который является ее началом.
Например, если массив выгдядит так:
0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0
, то количество элементов самой длинной последовательности, состоящей из одинаковых элементов, равно 5, а начинается она с 9-го элемента.