Привет всем! Вот такая задачка, есть вектор A[1..100] of integer;
надо создать процедуру которая будет показывать сколько нулей в самой длиной цепи из нулей в векторе, и показывать позиции в векторе первого и последнего нуля в цепи, например:
x 0000 xx 00
Результат:
нулей 4
первая позиция нуля -2
последнея позиция нуля -5.
С каких пор вообще тут пошла привычка не делать ни-че-го для решения своей задачи? Такого я больше ни на одном сайте не вижу, чтобы кто-то приходил и говорил "сделайте за меня", а если такое и происходит, то тема тонет под слоем жирного ржача.
Извините конечно, но я не просто скопировал и пошёл отдыхать, и я тоже не люблю такие вещи. Я два часа думал, ну и как-бы получился алгоритм для поиска цепей, но как показать позицию первого и последнего ноля так и не нашёл. Я в 10 классе. процедуры мы вообще не учим, я самостоятельно по книге учусь и на 11 класс, поэтому и несколько туплю.
Мне не нужно что бы вы сделали для меня програму, а подкинули идею как это можно сделать.
Спасибо за внимание.
Идея....
1. Считаем, что и начало, и конец максимальной последовательности - 0 элемент (если в массиве нумерация с 1)
2. Идем по массиву. Если встретили 0, ставим флажок в значение "истина"; запоминаем положение начала цепочки.
3. Пока флажок в истине, идем по массиву в поиске первого НЕнулевого элемента (или конца массива).
Как только нашли - сбрасываем флажок, запоминаем конец последовательности.
Сравниваем длину текущей последовательности с длиной максимальной. Если у текущей больше, меняем значения начала и конца для максимальной.
Кода не будет, пока ты САМ не приложишь хоть какие-то усилия к решению.
З.Ы. 10 класс - это вполне взрослые люди, способные отвечать за свои поступки. ИМХО.
k:=0; l:=0;
for i:=1 to n do begin
if a[i]=0 then k:=k+1;
if k>l then begin l:=k; k:=0; end;
writeln(l);о во
ну тут по поиску цепи более менее мне понятно, но как найти позицию в векторе первого и последнего нуля.
2 мисс_граффити:
флажок тут совершенно лишний.. Признаком того, что найдена последовательность, может являться само отличие ее длины от нуля. Но и это тоже лишнее , потому что можно считать что мы ВСЕГДА внутри последовательности нулей (может быть, нулевой длины)), то есть поиск ее вообще отпадает. И последнее: запоминать и начало, и конец - тоже слишком много чести, когда есть длина .
2 DarkWishmaster:
если что непонятно - спрашивай..
const
n=60;
var
i,l,m,x: integer;
a: array [1..n] of integer;
begin
Randomize;
for i:=1 to n do a[i]:=Random(3);
for i:=1 to n do Write(a[i]:(10-(i-1)mod 10) div 5);
WriteLn;
l:=0;
for i:=1 to n do begin
if a[i]=0 then Inc(l) else l:=0;
if l>m then begin
m:=l;
x:=i
end
end;
Write('max=',m);
if m>0 then Write(' x1=',x-m+1,' x2=',x);
ReadLn
end.
Ого спасибо огромное!
1)random(3) он заполняет вектор числами 0,1,2 -> вопрос, можно ли например заполнить тоже по 3 только в другом диапазоне -6,7,9. Или вообще задавать числа? И ещё вопрос, какую функцию выполняеть Randomize? потому что если его удалить то никаких изменений.
Дальше всё понятно, спасибо.
Такое страное ощущения когда думаешь и не получаеться что-то сделать а потом видешь как это просто )
Ну, например, random(10) выдаёт число от 0 до 9.
А вот random(17)-3 выдаёт число от -3 до 13
randomize нужен для того, чтобы числа не повторялись одни и те же при каждом запуске программы (он инициализирует генератор случайных чисел текущим временем).
Спасибо всем!
Теперь наверно тему можно закрыть.
1) в другом диапазоне можно, но он должен быть непрерывный. например -6,-7,-8. или 7,8,9. то есть подряд числа чтобы шли. конечно, при желании можно и -6,7,9 получить, но это надо будет уже писать свою обработку результатов.
2) инициализирует генератор случайных чисел. грубо говоря, чтобы при каждом новом запуске массив получался свой, а не всегда одинаковые.