Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 15

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

19.07.2024, 20:27. Показов 2432. Ответов 24
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую! Попал в тупик, программа вроде работает правильно, но тесты не проходит, есть какая то ошибка или я не правильно понял задание, просьба НЕ давать решение задачи, а указать на ошибку, а лучше привести пример массива который программа решает не правильно(проверял разные массивы выдает вроде правильно) тк понимаю, что разбирать такой код будет сложно.

Дабы корректно написать задание даю ссылку на сайт с заданием:
https://coderun.yandex.ru/sele... rrentPage=

Наибольшее произведение трех чисел
Не решалась
Лёгкая

В данном массиве из nn целых чисел найдите три числа, произведение которых максимально.
Формат ввода

В единственной строке расположено n (3≤n≤105) чисел ai​ (−106≤ai≤106) - элементы массива.
Формат вывода

Выведите три элемента массива, дающих наибольшее произведение, в любом порядке.
Ограничения

Ограничение времени

1 с

Ограничение памяти

64 МБ
C++
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <iostream>
#include <vector>
#include <algorithm> //(sort)
#include <string> 
#include <sstream> //(istringstream)
using namespace ::std;
 
 
int main()
{
    int th = 0; // первое число для ответа
    int mid = 0; //второе число для ответа
    int last = 0; //трете число для ответа 
    string stroka;
    vector<int>masiv;
    getline(cin, stroka); //Ввод текста с пробелами
    istringstream iss(stroka);
    string word;
    int a = 0;
    while (iss >> word)
    {
        int b = stoi(word);
        masiv.push_back(b);
 
 
    }
    sort(masiv.begin(), masiv.end());
    if (masiv[masiv.size() - 1] < 0) //если весь массив отрицательный
    {
        th = masiv[masiv.size() - 1];
        mid = masiv[masiv.size() - 2];
        last = masiv[masiv.size() - 3];
        cout << th << " " << mid << " " << last;
        return 0;
    }
    if (masiv[0] >= 0) //если все числа положительные
    {
        th = masiv[masiv.size() - 1];
        mid = masiv[masiv.size() - 2];
        last = masiv[masiv.size() - 3];
        cout << th << " " << mid << " " << last;
        return 0;
    }
    else
 
    {
        //предполагаем что это максимальные числа
        th = masiv[masiv.size() - 1];
        mid = masiv[masiv.size() - 2];
        last = masiv[masiv.size() - 3];
        if (masiv[0] < 0)
        {
            int minth = masiv[0] * (-1);
            if (minth > th) // если первое число массива по модулю больше последнего числа
            {
                int thanser = minth * (-1); // первое самое большое число отрицательное
 
                if (masiv[1] < 0) //проверяем второе число 
                {
                    int minmid = masiv[1] * (-1);
                    if (minmid > th) // второе число больше последнего 
                    {
                        int midanser = minmid * (-1); // второе большее число отрицательное
                        ++countminus;
                        cout << thanser << " " << midanser << " " << th; // тк если все числа не отрицательные 3 отрицательных не должно быть (тк ответ будет отрицательный) третье число последнее в массиве 
                            //оно точно максимальное положительно 
                        return 0;
                    }
                    if (minmid <= th)
                    {
                        if (minmid > mid)
                        {
                            int midanser = minmid * (-1); // второе большее число отрицательное
                            ++countminus;
                            cout << thanser << " " << midanser << " " << th; // тк если все числа не отрицательные 3 отрицательных не должно быть (тк ответ будет отрицательный) третье число последнее в массиве 
                            //оно точно максимальное положительно 
                            return 0;
                        }
                        if (minmid <= mid)
                        {
                            cout << last << " " << mid << " " << th;
                            return 0;
                        }
                    }
                }
                else
                {
                    cout << last << " " << th << " " << mid;
                    return 0;
                }
            }
            if (minth <= th)
            {
                if (minth > mid) // если первое по модулю число больше второго с конца
                {
                    int midanser = minth * (-1);// (первое число ответа th) это второе число ответа 
 
                    if (masiv[1] < 0)
                    {
                        int minmid = masiv[1] * (-1);
                        if (minmid > last)
                        {
                            int lastanser = minmid * (-1);
                            cout << th << " " << midanser << " " << lastanser;
                            return 0;
 
                        }
                        if (minmid <= last)
                        {
                            cout << th << " " << mid << " " << last;
                            return 0;
                        }
 
                    }
                    else
                    {
                        cout << last << " " << th << " " << mid;
                        return 0;
                    }
                }
 
                if (minth <= mid)
                {
                    if (minth > last)
                    {
                        int lastanser = minth * (-1);
                        cout << th << " " << mid << " " << last;
                        return 0;
 
                    }
                    else
                    {
                        cout << th << " " << mid << " " << last;
                        return 0;
                    }
                }
            }
        }
        cout << th << " " << mid << " " << last;
        return 0;
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.07.2024, 20:27
Ответы с готовыми решениями:

Переменной d присвоить наибольшее из трех чисел, а переменной s наименьшее из трех чисел.
Написать код программы с помощью оператора if в С++ Составить программу, которая переменной d присваивает наибольшее из трех чисел, а...

Наибольшее из трех чисел
Составить функцию, которая получает три аргумента х, y, и z, и возвращает как результат наибольшее из х,y,z.

Уменьшить на 5 наибольшее из трех чисел
Программа должна считать три числа, вводимых с клавиатуры, вывести их, предварительно уменьшив наибольшее из них на 5. #include...

24
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,574
22.07.2024, 13:49
Студворк — интернет-сервис помощи студентам
zipo, так если даже решение с sort проходит все тесты, то в чём вообще проблема?
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 15
22.07.2024, 16:42  [ТС]
Royal_X, Изначально тема была создана ради помощи в поиске примера, на который моя программа выдавала бы не правильный ответ, тк мне хотелось разобраться и понять где я допустил ошибку, а не получить готовый ответ, в ходе обсуждения я понял другой способ решения и переписал программу, у вас я хотел узнать, грубо говоря, как бы сделали вы через sort или как у вас в примере было, тк я не могу правильно определить сложность.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,574
22.07.2024, 16:58
Цитата Сообщение от zipo Посмотреть сообщение
как бы сделали вы через sort
через sort это самый простой способ

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> a{-9, 2, 1, -5, 6, 3, -4};
    std::sort(a.begin(), a.end());
    const auto n = a.size();
    long long m1 = a[n - 3] * a[n - 2] * a[n - 1];
    long long m2 = a[0] * a[1] * a[n - 1];
    if (m1 >= m2)
        std::cout << a[n - 3] << '\t' << a[n - 2] << '\t' << a[n - 1];
    else
        std::cout << a[0] << '\t' << a[1] << '\t' << a[n - 1];
}
Если такой код проходит, то нет смысла думать о преждевременной оптимизации.

Если такой код не проходит, то можно уже задуматься о других алгоритмах: использовать partial_sort, а еще лучше написать код по псевдокоду из поста Наибольшее произведение трех чисел
0
Заблокирован
22.07.2024, 17:50
zipo, чем пост #14 не устраивает?
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 15
22.07.2024, 19:03  [ТС]
Royal_X,Понял спасибо!
CoderPC, Всем устраивает, я же скинул практически точно такой же код в #20 посте который прошел все тесты
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.07.2024, 19:03

Наибольшее из трёх введенных чисел
Условие Добавьте к предыдущей программе функцию нахождения максимума из трёх чисел int max(int a, int b, int c). Формат входных...

Найти наибольшее из трёх чисел (с указателями)
Написать программу определяющую наибольшее из трёх чисел с помощью указателей

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

Найти наибольшее из трёх заданных чисел
max(x,y,z) и (x,y,z) , как решить помогите плз!

Выбрать наибольшее из трех заданных чисел
Выбрать наибольшее из трех заданных чисел


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru