Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2013, 13:15   #1
xotonic
 
Аватар для xotonic
 
Регистрация: 07.04.2013
Сообщений: 8
Сообщение Поиск максимума

Дано N чисел. Нужно найти максимум среди них и вывести на экран.
N - это большое число (N>10000) и оно вводится пользователем в начале программы, т.е. числа нельзя заносить в массив.
Еще желательно, чтобы программа выводила первые три максимума.

К примеру пользователь вводит:
20000 - кол-во чисел
123
34
567
5676
67
45
101
......
Программа выводит
1: 5676
2: 567
3: 123
xotonic вне форума Ответить с цитированием
Старый 07.04.2013, 15:51   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Вы всерьез предлагаете пользователю вводить более 10000 чисел с клавиатуры?
s-andriano вне форума Ответить с цитированием
Старый 07.04.2013, 19:45   #3
interacia
Пользователь
 
Аватар для interacia
 
Регистрация: 24.01.2013
Сообщений: 67
По умолчанию

Надолбить 10000 чисел на клавиатуре это дело хозяйское.

Поскольку язык программирования покрыт мраком то в общем виде
Может быть так
Алгоритм.
Код:
1 Объявляете необходимые переменные.
1,1 Объявляете счетчик для цикла целого типа
1,2 три переменные для хранения максимальных чисел
1,3 Объявляете переменную целого типа количество чисел 
1,4 Объявляете переменную для считывания текущего числа.
2 Задаете первоначальные значения переменным.
2,1 количество вводимы чисел 
2,2 первое число из серии 
2,3 трем переменным для хранения максимальных чисел задается 
     значение первогочисла
3 Организуете цикл от 2 до количества чисел
 3,1 Считываем следующие значение из серии 
 3,2 Организуем условие отбора максимальных чисел.
  3,2,1 С начало сравниваем текущее число с наибольшим 
     3,2,1,1 если текущее число окажется больше то перебрасываем
               значение второго максимального в третье
       3,2,1,2 а значение первого максимального во второе 
       3,2,1,3 и наконец первому максимальному присваиваем новое 
                 значение 
 3,2,2 сравниваем текущее число с максимальным вторым но так чтобы 
        текущее число еще оказалось и меньше первого максимального. 
      3,2,2,1 в этом случаи в третье максимальное переносим значение 
                второго максимального
      3,2,2,2 а во второе максимальное переносим новое значение
 3,2,3 сравниваем текущее число с максимальным третьим но так чтобы 
         текущее число при этом еще было меньше второго максимального.
       3,2,3,1 тогда меняем значение у третьего максимального на текущее 
                  число.
3,3 конец цикла
4 вывод результата
4,1 вывод первого максимального
4,2 вывод второго максимального
4,3 вывод третьего максимального
P.S. если что не так, извините не было возможности скомпилировать.
interacia вне форума Ответить с цитированием
Старый 07.04.2013, 20:38   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

interacia, предложу более простой и универсальный (на мой взгляд) вариант алгоритма.
Во-первых, заводим массив длиной с количество необходимых для вывода чисел. В нашем конкретном случае - длиной 3. Но в любой момент можно будет простым переопределением единственной константы, выводить 5, 20 или 100 наибольших чисел. А при использовании динамического массива даже задавать количество выводимых "максимумов" с клавиатуры без перекомпиляции программы.
А во-вторых, сравнивать текущее число, начиная не с наибольшего, а с наименьшего числа, если оказалось больше, то занести его вместо этого элемента, после чего в цикле от наименьшего к наибольшему сравнивать два соседних числа и при необходимости менять их местами (пузырек).

Последний раз редактировалось s-andriano; 07.04.2013 в 20:41.
s-andriano вне форума Ответить с цитированием
Старый 07.04.2013, 21:26   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

s-andriano, пусть в массиве на 3 элемента хранятся числа 3 2 1. Текущее число 2. Оно больше наименьшего, следовательно заменит 1. В массиве будет 3 2 2.

Нужно обговорить момент - требуется получить K максимумов из всех чисел (т.е. как если бы взяли последовательность, отсортировали по возрастанию и взяли K последних чисел) или K уникальных максимумов (если бы из отсортированной последовательности выбросили все повторы и взяли те же K последних).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.04.2013, 22:15   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

BDA, согласен с обоими замечаниями.
1. В принципе, необходимо отслеживать границу заполненной части массива, и сравнивать текущий элемент не с последним, а именно с "граничным", и если граница не достигла конца массива вместе с "пузырьком" пускать "камень", т.е. элемент, обменами перемещающийся вниз по массиву. Пока молчаливо подразумевается, что граница уйдет за пределы массива, но в общем случае это не так.
2. Да, хотя интуитивно представляется, что каждый максимум уникален (раз представлен отдельным числом), то его следует отдельно сохранять (вместе с ним, кстати, может понадобиться сохранять и что-то еще, например, абсолютную позицию или номер). Но, в принципе, может потребоваться и вариант, при котором максимумы одинаковой величины считаются неразличимыми, и их нужно "прореживать". В этом случае. По крайней мере, текущей формулировке такой вариант не противоречит.
В этом случае добавляется лишний цикл, проверяющий, есть ли уже в массиве такой элемент. И производить вставку, только если нет.

Последний раз редактировалось s-andriano; 07.04.2013 в 22:20.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск максимума из четных элементов Yakov112 Общие вопросы C/C++ 1 16.10.2012 20:09
последовательность чисел - поиск максимума, второго после максимума значения, количество чисел равных максимуму wasy96 Паскаль, Turbo Pascal, PascalABC.NET 1 28.09.2011 01:19
Поиск максимума sp_Иришка Общие вопросы C/C++ 9 17.12.2009 15:18
поиск второго максимума Arcueid1691 Общие вопросы C/C++ 7 15.10.2009 22:43
Поиск Максимума в двумерном массиве NSvirus Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 20.09.2009 18:04