Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
1 / 1 / 0
Регистрация: 30.01.2020
Сообщений: 51

Наибольшее произведение трех чисел

04.08.2021, 15:08. Показов 4931. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В данном списке из n≤10⁵ целых чисел найдите три числа,произведение которых максимально.

Решение должно иметь сложность O(n), где n - размер списка. То есть сортировку использовать нельзя.

Выведите три искомых числа в любом порядке.
Python
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
x = list(map(int, input().split()))
 
lol = x.copy()
hah = max(lol)
lol.pop(lol.index(max(lol)))
yu = max(lol)
lol.pop(lol.index(max(lol)))
su = max(lol)
lol.pop(lol.index(max(lol)))
lol = x.copy()
y1 = min(lol)
lol.pop(lol.index(min(lol)))
y2 = min(lol)
lol = x.copy()
if max(x) > 0:
    if y1 * y2 > hah * yu:
        lol.remove(y1)
        lol.remove(y2)
        print(y1, y2, max(lol))
    else:
        lol.remove(hah)
        lol.remove(yu)
        print(hah, yu, max(lol))
else:
    print(yu, su, hah)
Вот мой код, рабочий, но не полностью. Например тесты -9 -9 9 9 не проходит, какую проверку делать, или перерешивать с помощью цикла?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.08.2021, 15:08
Ответы с готовыми решениями:

Наибольшее произведение трех чисел
Задача: В данном списке из n ≤ 105 целых чисел найдите три числа,произведение которых максимально. Решение должно иметь сложность O(n),...

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

Найти сумму, произведение и среднее арифметическое трёх целых чисел, введённых с клавиатуры
Всем привет. На курсе попалось такое простецкое задание Напишите программу, которая находит сумму, произведение и среднее...

13
 Аватар для Matrix3007
198 / 164 / 41
Регистрация: 13.05.2019
Сообщений: 844
04.08.2021, 16:05
Python
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
maxp1=maxp2=maxo1=maxo2=0
sp=map(int, input().split())
 
for i in sp:
    a,b,c=map(abs,(maxo1,maxo2,i))
    if i>0:
        if i>maxp1:
            maxp1,maxp2,maxo1,maxo2=i,maxp1,maxp2,maxo1
        elif i>maxp2:
            maxp2,maxo1,maxo2=i,maxp2,maxo1
        elif i>a:
            maxo1,maxo2=i,maxo1
        elif i>b:
            maxo2=i
    else:
        if c>a:
            maxo1,maxo2=i,maxo1
        elif c>b:
            maxo2=i
 
res=[x for x in (maxo1,maxo2) if x>0]
if len(res)==0:
    print(maxp1,maxo1,maxo2)
else:
    print(maxp1,maxp2,res[0])
1
 Аватар для kernel_mode
70 / 47 / 16
Регистрация: 21.07.2021
Сообщений: 187
04.08.2021, 20:25
Наибольший результат произведения трех чисел даст произведение трех наибольших по значению чисел (одного знака), либо
двух чисел с наибольшим абсолютным значением (одного знака) с одним положительным числом.

Поэтому реализовать сортировку или сравнение будет наиболее правильным решением с точки зрения производительности.
Можно, конечно, использовать три цикла for внутри друг друга, перемножая все и вся, сравнивая результат с предыдущим, но это не эффективно.
0
1 / 1 / 0
Регистрация: 30.01.2020
Сообщений: 51
04.08.2021, 21:08  [ТС]
kernel_mode, у меня нет проблем с логикой в задаче, есть с реализацией, потому как бы и спрашиваю

Добавлено через 2 минуты
Matrix3007, -1 -2 -3 -4 -5 при тесте таком получается 0 -5 -4, откуда 0?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
04.08.2021, 21:52
Лучший ответ Сообщение было отмечено karslava как решение

Решение

karslava,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
x = list(map(int, input().split()))
 
lol = x.copy()
 
hah = max(lol)
lol.pop(lol.index(hah))
 
yu = max(lol)
lol.pop(lol.index(yu))
 
su = max(lol)
 
lol = x.copy()
 
y1 = min(lol)
lol.pop(lol.index(min(lol)))
 
y2 = min(lol)
 
if y1 * y2 * hah  > hah * yu * su:
    print(y1, y2, hah)
else:
    print(su, yu, hah)
1
1 / 1 / 0
Регистрация: 30.01.2020
Сообщений: 51
04.08.2021, 22:05  [ТС]
Gdez, Спасибо огромное, я убрал это из кода думая что все как в математике...
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
04.08.2021, 22:12
karslava, По идее :
Python
1
2
3
x.sort()
y1, y2 = x[:2]
su, yu, hah = x[-3:]
1
1 / 1 / 0
Регистрация: 30.01.2020
Сообщений: 51
04.08.2021, 22:18  [ТС]
Gdez, в условии сказано что сложность длина массива, значит sort nelzya)
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
05.08.2021, 04:46
Python
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
print( "gorgeous YUEN HOIFEF" )
 
 
 
lol = [ -20, -55, 0, 5, 20, 7, 4, 180, 19, 19, 3, 10, 2 ]
 
plusbrol = [ 0 ] * 3
minusbrol = [ 0 ] * 3
 
"""ABDxxxXXXX45557DSD__DOPDKM3$$$433"""
for c in lol :
    if c > 0 :
       if plusbrol[ 2 ] < c :
          plusbrol[ 1 ] = plusbrol[ 2 ]
          plusbrol[ 2 ] = c
       if plusbrol[ 1 ] < c and c < plusbrol[ 2 ] : plusbrol[ 1 ] = c
       if plusbrol[ 0 ] < c and c < plusbrol[ 1 ] : plusbrol[ 0 ] = c
    elif c < 0 :
       if minusbrol[ 2 ] > c :
          minusbrol[ 1 ] = minusbrol[ 2 ]
          minusbrol[ 2 ] = c
       if minusbrol[ 1 ] > c and c > minusbrol[ 2 ] : minusbrol[ 1 ] = c
       if minusbrol[ 0 ] > c and c > minusbrol[ 1 ] : minusbrol[ 0 ] = c
"""ABDxxxXXXX45557DSD__DOPDKM3$$$433--"""
 
f = -1
i = 0
while i < 3 :
   if minusbrol[ i ] >= 0 :
      if f == -1 :
         f = i
      else :
         f = -1
         break
   i+=1
 
 
if f > (-1) :
   minusbrol[ f ] = plusbrol[ 2 ]
 
n1 = 1
n2 = 1
 
for c in plusbrol :
   n1 *= c
 
for c in minusbrol :
   n2 *= c
 
if n1 > n2 : print( str(plusbrol) + "  " + str(n1)  )
else : print( str(plusbrol) + "  " + str(n1)  )
Реализовал алгоритм предложенный
kernel_mode,
Но вот много строк получилось.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
05.08.2021, 05:17
YUEN HOIFEF, [-55, -20, 180] 198000
1
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
05.08.2021, 05:30
Доделывать надо..

Добавлено через 7 минут
Gdez,
Python
1
print( -55 * -20 * 180 )
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
05.08.2021, 14:12
Подправил:
Python
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
print( "Long live YUEN HOIFEF" )
 
 
lol = [ -20, -55, 0, 5, 20, 7, 4, 180, 19, 19, 3, 10, 2 ]
#lol = [ -9, 9, 9 ]
 
plusbrol = [ 1 ] * 3
minusbrol = [ 1 ] * 3
 
 
"""ABDxxxXXXX45557DSD__DOPDKM3$$$433"""
for c in lol :
   if c > 0 :
      if plusbrol[ 2 ] < c :
         plusbrol[ 1 ] = plusbrol[ 2 ]
         plusbrol[ 2 ] = c
 
      elif plusbrol[ 1 ] < c :
         plusbrol[ 0 ] = plusbrol[ 1 ]
         plusbrol[ 1 ] = c
 
      elif plusbrol[ 0 ] < c : plusbrol[ 0 ] = c
   elif c < 0 :
      if minusbrol[ 2 ] > c :
         minusbrol[ 1 ] = minusbrol[ 2 ]
         minusbrol[ 2 ] = c
      if minusbrol[ 1 ] > c :
         minusbrol[ 0 ] = minusbrol[ 1 ]
         minusbrol[ 1 ] = c
      if minusbrol[ 0 ] > c  : minusbrol[ 0 ] = c
"""ABDxxxXXXX45557DSD__DOPDKM3$$$433--"""
 
f = -1
i = 0
while i < 3 :
   if minusbrol[ i ] >= 0 :
      if f == -1 :
         f = i
      else :
         f = -1
         break
   i+=1
 
 
if f > (-1) :
   minusbrol[ f ] = plusbrol[ 2 ]
 
n1 = 1
n2 = 1
 
for c in plusbrol :
   n1 *= c
 
for c in minusbrol :
   n2 *= c
 
print( lol )
if n1 > n2 : print( str(plusbrol) + " = " + str(n1) )
else : print( str(plusbrol) + " = " + str(n1) )
0
1 / 1 / 0
Регистрация: 30.01.2020
Сообщений: 51
05.08.2021, 14:33  [ТС]
YUEN HOIFEF, ок, но зачем?...
0
 Аватар для Matrix3007
198 / 164 / 41
Регистрация: 13.05.2019
Сообщений: 844
05.08.2021, 18:45
Цитата Сообщение от karslava Посмотреть сообщение
-1 -2 -3 -4 -5 при тесте таком получается 0 -5 -4, откуда 0?
Решается добавлением одного условия
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2021, 18:45
Помогаю со студенческими работами здесь

Если сумма трех попарно различных действительных чисел х, у , z меньше единицы, то наименьшее из этих трех чисел заменит
Если сумма трех попарно различных действительных чисел х, у , z меньше единицы, то наименьшее из этих трех чисел заменить полусуммой двух...

Наибольшее произведение трех чисел
В данном массиве из n целых чисел найдите три числа, произведение которых максимально. Решение должно иметь сложность O(n), где n -...

Сумма, произведение и среднее арифметическое трёх целых чисел
Напишите программу, которая находит сумму, произведение и среднее арифметическое трёх целых чисел, введённых с клавиатуры. Входные...

Если сумма трех попарно различных вещественных x, y, z < 1, то наименьшее из этих трех чисел заменить полусуммой двух
Если сумма трех попарно различных вещественных x, y, z &amp;lt; 1, то наименьшее из этих трех чисел заменить полусуммой двух других, в ...

Вычислить произведение P кубов трех чисел a, b и c, если их сумма меньше нуля, произведение P модулей трех чисел a, b и c, если их сумма больше нуля
Вычислить произведение P кубов трех чисел a, b и c, если их сумма меньше нуля, произведение P модулей трех чисел a, b и c, если их сумма...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru