Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Наибольшее число в последовательности и его размещение

Автор: Kolyancz 9.12.2008 21:18

Задана последовательность N чисел. N<=1000. Найдите наибольшее число в этой последовательности и укажите на какой позиции оно находится. Если число повторяется, то указать все его позиции.
Например: для последовательности 569 3 567 94 569 219 546
Ответ:
569
1 5
Впорос: как выглядит функция определения наибольшего числа и расчета его размещений?

Автор: Ozzя 9.12.2008 21:35

Последовательность как хранится? В массиве? Или массивы использовать нельзя?

Автор: Kolyancz 9.12.2008 22:34

Цитата(Ozzя @ 9.12.2008 15:35) *

Последовательность как хранится? В массиве? Или массивы использовать нельзя?

В массиве.

Автор: amega 9.12.2008 23:09

один из ваирантов;

 
var a,b:array [1..7] of integer; max,i,j:integer;
begin
max:=1;
j:=1;
for i:=1 to 7 do
if a[i]>max then max:=a[i]; //находим в цикле максимальный элемент

for i:=1 to 7 do
if a[i]=max then
begin
b[j]:=i; //нормируем новый массив состоящий из позиций максимального элеммента
j:=j+1;
end;
// вывод позиции
// for i:=1 to j-1 do wrie(' ',j);
//


Автор: volvo 9.12.2008 23:13

Это можно сделать за один проход по основной последовательности... В случае, когда N может достигать 1000, это желательно делать именно за один, а не за два прохода...

P.S. К тому же, amega, твой вариант не отработает, если в исходной последовательности нет чисел больше 0...

Автор: amega 9.12.2008 23:34

тогда поменять прото начальное max:=0;

а можеш выложить алгоритм за один проход ?

Автор: volvo 9.12.2008 23:37

Цитата
тогда поменять прото начальное max:=0;
smile.gif Тогда не отработает, если все числа - меньше чем 0... Все проще: надо присваивать max первому элементу последовательности...

Вот однопроходный алгоритм:
  max := a[1];
j := 0;
for i := 1 to n do begin
if a[i] = max then begin
inc(j); b[j] := i;
end
else
if a[i] > max then begin
max := a[i];
j := 1; b[j] := i;
end;
end;

for i := 1 to j do
write(b[i]:5);


Автор: amega 9.12.2008 23:51

смотри а если у нас 1ий елент максимальный И он только один что происходит (например 99 1 2 3 2 1 1 5)

max := a[1];
j := 0; <------------------------------------------------ j=0
for i := 1 to n do begin
if a[i] = max then begin <-------------------------------------------- 1ий елемент максимальній
inc(j); b[j] := i; <------------------------------------------- b[0]:=1;
end
else
if a[i] > max then begin <---- вариант на елс выполнятся не будет
max := a[i];
j := 1; b[j] := i; <---- а значит j не присвоится 1
end;
end;

for i := 1 to j do <------------------------------------------ кода выводим начинаем выводить с b[1] !!!!!
write(b[i]:5);

Автор: Айра 10.12.2008 0:24

  if a[i] = max then begin
inc(j); //а вот это что по твоему? как раз таки увеличение j на 1цу
b[j] := i;


Автор: amega 10.12.2008 1:52

а, ну да недогледел чуть-чуть !yessir.gif

Автор: Kolyancz 10.12.2008 19:00

Да, все правильно. Вот полное решение, всем спасибо.

Код

var J,i,n,max: integer;
    a :array[1..1000] of integer;
     b:array[1..1000] of integer;
begin
n:=0;
while not eoln do begin
  inc(n); read(a[n]);
end;
   begin
   max := a[1];
  j := 0;
  for i := 1 to n do begin
    if a[i] = max then begin
      inc(j); b[j] := i;
    end
    else
      if a[i] > max then begin
        max := a[i];
        j := 1; b[j] := i;
      end;
  end;
    writeln(max);
  for i := 1 to j do
    write(b[i]:5);

readln;
readln
end;
end.