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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2011, 22:20   #1
Arn1
 
Регистрация: 29.09.2011
Сообщений: 9
По умолчанию Найти числа произведение которых самое большое

Здраствуйте,такая вот задача
Дано N целых чисел. Требуется выбрать из них три таких числа, произведение которых максимально. Формат входных данных Во входном файле записано сначала число N - количество чисел в последовательности (3<=N<=100). Далее записана сама последовательность: N целых чисел, по модулю не превышающих 1000. Формат выходных данных В выходной файл выведите три искомых числа в любом порядке. Если существует несколько различных троек чисел, дающих максимальное произведение, то выведите любую из них.

я думал решить найдя,просто самые максимальные число,с помощью трех циклов, типа самый максимальный элемент в 1 вом цикле не может быть использован во 2 ром и т.д для третьего...подскажите как сделать,но простым языком как я пишу. и там в задаче берется в модуль. но я пока что не брал чтобы просто посмотреть как будет работать мой код

Код
Код:
#include<iostream>
using namespace std;
int main(){
int i,j,z,n,c1=0,c2=0,c3=0,a[100];

cin>>n;
for(i=0;i<n;i++){
cin>>a[i];
}
while(i!=j && j!=z && i!=z){
for(i=0;i<n;i++){
if(a[i]>c1)
c1=a[i];
}
for(j=0;j<n;j++){
if(a[j]>c2)
c2=a[j];
}
for(z=0;z<n;z++){
if(a[z]>c3)
c3=a[z];

}
}
cout<<c1<<" "<<c2<<" "<<c3;

return 0;

}

Последний раз редактировалось alex_fcsm; 02.10.2011 в 23:41.
Arn1 вне форума Ответить с цитированием
Старый 03.10.2011, 10:56   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

проще, имхо, отсортировать массив по убыванию.
и взять первые три числа из образованного массива.

p.s. можно и без сортировки обойтись. И даже за один проход решить задачу. Но алгоритм такой должен быть. Нужно где-то хранить три индекса найденных максимальных значений (вначале все три индекса положить какому-то невозможному индексу. ну, например, в вашем случае, вначале все индексы положить равными -1). И дальше, сравнивать очередное число, размещает индексы очередных элементов по степени возрастания величин соответствующих им значений в массиве. При необходимости "сдвигая" остальные среди этих трёх максимальных.
понимаю, что написал запутанно... если будет интерес и не разберётесь - постараюсь объяснить на примере. Кодом, к сожалению, помочь не могу - ибо C не знаю. Код на Паскаль устроит?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.10.2011, 11:05   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
отсортировать массив по убыванию.
и взять первые три числа из образованного массива.
поойдет для НЕотрицательых, но у нас
Цитата:
Дано N целых чисел
пример массива
-10000 -1 1 2 3 4 5 6 7

-10000 * -1 * 7 =70000 НАИБОЛЬШЕЕ произведение ТРЕХ.
5 * 6 * 7 = 210 произведение трех максимальных.
надо еще добавить проверку двух наименьших отрицательных и одного максимального
положительного. И еще пожалуй случай когда в эти три максимальные(минимальные) попадет 0.

Цитата:
я думал решить найдя,просто самые максимальные число,с помощью трех циклов, типа самый максимальный элемент в 1 вом цикле не может быть использован во 2 ром и т.д для третьего...подскажите как сделать,но простым языком как я пишу.
Код:
с1=a[0]; c2=a[1]; c3=a[3]; //берем первые три как начальные максимальные
for(i=0;i<n;i++) // перебираем первый 
{  for(j=i+1;j<n;j++)// перебираем второй но только те которые ПОСЛЕ первого j=i+1
//те которые были до первого мы уже проверили считая их первым числом.
   {  for(z=j+1;z<n;z++) // перебирам третий после второго
      { if(a[i]*a[j]*a[z]>c1*c2*c3) // если надо
         { c1=a[i]; c2=a[j]; c3=a[z]; //меняем компоненты максимального }
      }
   }
}
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.10.2011 в 11:46.
evg_m вне форума Ответить с цитированием
Старый 03.10.2011, 11:55   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

согласен с замечанием.

хорошая задачка!

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

И выбирать сложнее прийдётся, пропуская некоторые числа и анализируя другие, например, так, чтобы если есть выбор - отрицательных брать пару. А если оно (отрицательное число - одно - игнорировать!) и, похоже, всё таки, в некоторых случаях прийдётся перебирать варианты из отсортированного массива...
впрочем. я вижу всего несколько вариантов.
если произведение первых трёх чисел имеет положительный знак - ответ очевиден.
иначе, надо сравнить произведения
P1:= первое отрицательное числа из этих трёх * на первое положительное число из 3-х и на первое встречное отрицательное число (оно может быть в отсортированном массиве на любом месте, хоть крайнее!)
и P2: произведение первых трёх положительных чисел с верхушки массива...

p.s. возможно, что есть ещё какой-то вариант. но от тут же, рядом с верхушкой отсортированного массива...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.10.2011, 13:27   #5
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Не претендую на оригинальность, но я бы предложил проверить в отсортированном массиве две тройки, если отрицательных чисел больше, чем два, и одну - если их меньше, либо число положительных чисел меньше трех.

Если отрицательных >2, то сравниваем произведение двух наименьших отрицательных и наибольшего положительного с произведением трех последних положительных.

Если же отрицательных чисел одно или вообще нет, то просто смотрим произведение максимальных положительных.

Если положительных одно или два - берем тройку, состоящую из двух наименьших отрицательных + наибольшее положительное.

Ну и, конечно же, надо предусмотреть вариант, что все числа отрицательны. Тогда берем произведение трех максимальных.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)

Последний раз редактировалось Vanta11a; 03.10.2011 в 13:29.
Vanta11a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать самое большое число в столбце? Dux БД в Delphi 7 04.09.2011 21:22
Найти произведение цифр данного числа chertovka. Помощь студентам 2 25.06.2010 11:59
Паскаль АВС - найти самое большое из четырёх чисел Dante123 Помощь студентам 4 14.04.2009 17:42
Найти все целые числа,у которых ровно 6 делителей; jenja Общие вопросы C/C++ 3 03.10.2008 20:32
ДАНЫ 4 ЧИСЛА X Y Z W составит программу найти произведение все положительные нечетные числа Woland-itn Паскаль, Turbo Pascal, PascalABC.NET 3 23.03.2008 21:49