0 / 0 / 2
Регистрация: 17.10.2013
Сообщений: 66
1

Нахождение чисел с максимальным произведением

02.02.2014, 15:10. Показов 1592. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые форумчане, помогите написать программу: в массиве нужно найти такую пару числе произведение которых максимально.(числа в массиве могут быть любые)

Заранее благодарен.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2014, 15:10
Ответы с готовыми решениями:

Найти двойку чисел с максимальным произведением
Разработать программу, которая вводит 4 целых числа a, b, c, d и находит среди них двойку чисел с...

Число с максимальным произведением цифр
Найти на заданном отрезке число с максимальным произведением цифр. Паскаль

Найти столбец с максимальным произведением элемента
Найти столбец с максимальным произведением элемента Только сам цикл,благодарю Язык Си

Вывести векторы с максимальным скалярным произведением
вот собствеено код мне выдает ошибку Ошибка C2664 "double skalyarniydobutok(int ,int )":...

27
Модератор
9854 / 5224 / 3304
Регистрация: 17.08.2012
Сообщений: 15,983
02.02.2014, 15:47 2
Лучший ответ Сообщение было отмечено Sepheroth как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var i, j, i1, i2: integer;
    a: array [1..n] of integer;
begin
  randomize;
  writeln('Source array:');
  for i := 1 to n do
    begin
      a[i] := random(198) - 99;
      write(a[i]: 4)
    end;
  writeln;
  i1 := 1;
  i2 := 2;
  for j := 1 to n - 1 do
    for i := j + 1 to n do
      if a[i] * a[j] > a[i1] * a[i2]
        then begin
          i1 := i;
          i2 := j
        end;
  writeln('Max product = a[', i2, ']*a[', i1, ']=', a[i1]*a[i2]);
  readln
end.
1
0 / 0 / 2
Регистрация: 17.10.2013
Сообщений: 66
02.02.2014, 16:01  [ТС] 3
Спасибо большое!
0
Платежеспособный зверь
8924 / 4352 / 1642
Регистрация: 28.10.2009
Сообщений: 11,567
02.02.2014, 22:05 4
Нерациональный алгоритм. Максимум на 3 балла. Всё это можно было легко сделать за 1 проход по массиву.
0
Модератор
9854 / 5224 / 3304
Регистрация: 17.08.2012
Сообщений: 15,983
02.02.2014, 23:51 5
кот Бегемот, не хотелось использовать четыре переменные.
0
Платежеспособный зверь
8924 / 4352 / 1642
Регистрация: 28.10.2009
Сообщений: 11,567
02.02.2014, 23:57 6
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
кот Бегемот, не хотелось использовать четыре переменные.
ну, конечно, вложенный цикл лучше, особенно на больших значениях ...
0
Модератор
9854 / 5224 / 3304
Регистрация: 17.08.2012
Сообщений: 15,983
03.02.2014, 00:16 7
Да, O(n) лучше, чем O(n2), кто ж спорит... Но в данном случае при O(n) получается уж очень код не очень читабельный... И длинный...
0
Платежеспособный зверь
8924 / 4352 / 1642
Регистрация: 28.10.2009
Сообщений: 11,567
03.02.2014, 00:56 8
Ну, всё зависит от цели задания. Если просто решить, то и такой код прокатит, а если, например, в ЕГЭ, то результат вообще могут не зачесть, поскольку там по условию алгоритм должен быть однопроходным. А значит минус 6-9 баллов...
0
Модератор
9854 / 5224 / 3304
Регистрация: 17.08.2012
Сообщений: 15,983
03.02.2014, 13:02 9
Не поленился, написал...
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
const n = 10;
var i, ii, in1, in2, ip1, ip2: integer;
    a: array [1..n] of integer;
begin
  randomize;
  writeln('Source array:');
  for i := 1 to n do
    begin
      a[i] := random(198) - 99;
      write(a[i]: 4)
    end;
  writeln;
  if n < 2
    then writeln('Error: array too short')
    else begin
      in1 := 0;
      in2 := 0;
      ip1 := 0;
      ip2 := 0;
      for i := 1 to n do
        if a[i] < 0
          then begin
            if in1 = 0
              then in1 := i
              else if in2 = 0
                then in2 := i
                else if (a[i] < a[in1]) or (a[i] < a[in2])
                  then if a[in1] < a[in2]
                    then in2 := i
                    else in1 := i
          end
          else begin
            if ip1 = 0
              then ip1 := i
              else if ip2 = 0
                then ip2 := i
                else if (a[i] > a[ip1]) or (a[i] > a[ip2])
                  then if a[ip1] > a[ip2]
                    then ip2 := i
                    else ip1 := i
          end;
      case (2 * ord(ip2 > 0) + ord(in2 > 0)) of
        0: begin
             i := in1;
             ii := ip1
           end;
        1: begin
             i := in1;
             ii := in2
           end;
        2: begin
             i := ip1;
             ii := ip2
           end;
        3: if a[in1] * a[in2] > a[ip1] * a[ip2]
             then begin
               i := in1;
               ii := in2
             end
             else begin
               i := ip1;
               ii := ip2
             end
      end;
      writeln('Max product = a[', i, '] * a[', ii, '] = ', a[i] * a[ii])
    end;
  readln
end.
Несчастные выпускники...
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
03.02.2014, 15:08 10
Да ну Вас - так извращаться...
Я бы просто отсортировал массив по убыванию и тогда искомые числа - первые два элемента массива.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
03.02.2014, 15:11 11
Какие 4 переменные? Надо найти всего лишь два наибольших элемента массива, их произведение и будет максимальным.
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
03.02.2014, 15:13 12
Цитата Сообщение от taras atavin Посмотреть сообщение
Какие 4 переменные? Надо найти всего лишь два наибольших элемента массива, их произведение и будет максимальным.
Именно это я и написал постом ранее...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
03.02.2014, 15:26 13
Цитата Сообщение от APALoff Посмотреть сообщение
и тогда искомые числа - первые два элемента массива.
Правда? Ну, попробуй вот с таким массивом, например:
<1, 2, 3, -6, -8, 5, 1, 5>
1
1642 / 1091 / 487
Регистрация: 17.07.2012
Сообщений: 5,345
03.02.2014, 15:33 14
Цитата Сообщение от taras atavin Посмотреть сообщение
Надо найти всего лишь два наибольших элемента массива,
А отрицательные элементы кто-то отменял?
1
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
03.02.2014, 15:50 15
Цитата Сообщение от UI Посмотреть сообщение
Правда? Ну, попробуй вот с таким массивом, например:
<1, 2, 3, -6, -8, 5, 1, 5>
В условии нигде не сказано про произведение абсолютных величин... просто произведение... т.е. работать такой алгоритм будет. А если что, то и сортировку можно делать по абсолютным значениям...

Добавлено через 1 минуту
Цитата Сообщение от Новичок Посмотреть сообщение
А отрицательные элементы кто-то отменял?
Они не мешают.

Добавлено через 1 минуту
UI, ааа, я понял что ты имеешь в виду...

Добавлено через 13 секунд
да, тут можно задуматься...

Добавлено через 1 минуту
тогда действительно - либо перебором произведений всех, либо сложная и запутанная система проверок на два отрицательных элемента...
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
03.02.2014, 15:53 16
Цитата Сообщение от APALoff Посмотреть сообщение
Именно это я и написал постом ранее...
Нет.
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
03.02.2014, 16:02 17
taras atavin, ну если предположить, что все значения положительные (а тут уже прокол выходит), то гораздо короче будет записать сортировку вложенным циклом, чем поиск сразу двух максимальных в один проход... или я ошибаюсь?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
03.02.2014, 16:08 18
Нет. Вложенный цикл - это два цикла, а поиск двух максимальных - один.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
03.02.2014, 16:22 19
По мне - проще было бы написать
вот так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const n = 10;
var
  i: integer;
  a: array [0..n] of integer;
  b : boolean;
  first, second : array[boolean] of integer;
 
begin
  randomize;
  writeln('Source array:');
  for i := 1 to n do
  begin
    a[i] := random(198) - 99;
    write(a[i]: 4)
  end;
  writeln;
  if n < 2 then writeln('Error: array too short')
  else if n = 2 then writeln('Single combination : a[1]*a[2] = ', a[1]*a[2])
  else
  begin
    for i := 1 to n do
    begin
      b := a[i] > 0;
      if first[b] = 0 then first[b] := i
      else if a[i] > a[first[b]] = b then
      begin
        second[b] := first[b];
        first[b] := i;
      end
      else
        if (second[b] = 0) or (a[i] > a[second[b]] = b) then second[b] := i;
    end;
    b := a[first[true]]*a[second[true]] > a[first[false]]*a[second[false]];
    writeln('Max product = a[',first[b], '] * a[', second[b], '] = ',
      a[first[b]] * a[second[b]]);
  end;
  readln
end.
0
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
03.02.2014, 16:31 20
Цитата Сообщение от APALoff Посмотреть сообщение
Я бы просто отсортировал массив по убыванию
Сортировка не за O(n), если числа любые.

Цитата Сообщение от APALoff Посмотреть сообщение
Я бы просто отсортировал массив по убыванию и тогда искомые числа - первые два элемента массива.
Неверно.
1000 -1000 -2000
0
03.02.2014, 16:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2014, 16:31
Помогаю со студенческими работами здесь

Найти столбец матрицы с максимальным произведением
ФУНКЦИИ И ПОДПРОГРАММЫ Разработать программы содержащие процедуры и функции, решающие...

Найти в матрице столбец с максимальным произведением.
Всем доброго времени суток, помогите люди добрые, закралась ошибка в мой код, никак не могу...

Вывести число меньшее n с максимальным произведением делителей
Дано натуральное число n. Вывести число меньшее n с максимальным произведением делителей.

Найти строку с максимальным произведением элементов в матрице
дана матрица A, Организовать процедуры заполнения и вывода матрицы на экран. Найти строку с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru