Задача
Даны целые числа [latex]a_1,\ldots,a_n[/latex].
Если в данной последовательности ни одно четное число не расположено после нечетного,
то получить все отрицательные члены последовательности, иначе –все положительные. Порядок следования чисел в обоих случаях заменяется на обратный.
Тесты
Входные данные | Выходные данные |
-1 -4 5 7 | 7 5 |
1 2 3 4 5 -6 | 5 4 3 2 1 |
2 1 1 1 1 | — |
Алгоритм
Для начала считываем все числа входного потока и добавляем их в вектор.
Изначально предпологаем, что в полученной последовательности ни одно четное не расположено после нечетного (для этого заведем логический флаг, показывающий выполняется ли данное условие). Смотрим на пары последовательных элементов, пока не найдем противоречия условию или же не подтвердим его выполнение, дойдя до конца не изменив значение логического флага. Затем проходим исходную последовательность задом наперед и в зависимости от значения логического флага кладем в результирующую последовательность положительные или отрицательные члены исходной.
В итоге, получим требуемую в условии последовательность.
Изначально предпологаем, что в полученной последовательности ни одно четное не расположено после нечетного (для этого заведем логический флаг, показывающий выполняется ли данное условие). Смотрим на пары последовательных элементов, пока не найдем противоречия условию или же не подтвердим его выполнение, дойдя до конца не изменив значение логического флага. Затем проходим исходную последовательность задом наперед и в зависимости от значения логического флага кладем в результирующую последовательность положительные или отрицательные члены исходной.
В итоге, получим требуемую в условии последовательность.
Код
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 |
#include <cmath> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { vector <int> a, b; int element; while (cin >> element) { a.push_back(element); } bool getNegative = true; for (int i = 0; i < a.size() - 1; i++) { if (abs(a[i]) % 2 == 1 && a[i + 1] % 2 == 0) { getNegative = false; break; } } if (getNegative) { for (int i = a.size() - 1; i >= 0; i--) { if (a[i] < 0) { b.push_back(a[i]); } } } else { for (int i = a.size() - 1; i >= 0; i--) { if (a[i] > 0) { b.push_back(a[i]); } } } for (int i = 0; i < b.size(); i++) { cout << b[i] << " "; } return 0; } |
У Вас getNegative проверяется для каждого элемента массива. Разве он как-то меняется? Попробуйте написать экономнее.
Исправлено
Формально да. Но у этого кода существенный недостаток. В части после if и после else написан тот же код. Отличие только в одном символе. Нужно что-то делать…