Задача
Даны действительные числа [latex]a_{1},a_{2},\cdots[/latex] (читать до конца входного потока). Переставить члены последовательности так, чтобы сначала расположились все ее неотрицательные члены, а потом — все отрицательные. Порядок как среди неотрицательных членов, так и среди отрицательных должен быть сохранен прежним.
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> #include <vector> using namespace std; int main() { vector <long double> v1, v2, v3; long double n; while (cin >> n){ v1.push_back(n); } for (int i = 0; i < v1.size(); i++){ if (v1[i] < 0) v3.push_back(v1[i]); else v2.push_back(v1[i]); } v2.insert(v2.end(), v3.begin(), v3.end()); for (int i = 0; i < v2.size(); i++){ cout << v2[i] << " "; } cout << endl; return 0; } |
Test № | Input | Output |
1 | -23 45 17 -78 0 34 | 45 17 0 34 -23 -78 |
2 | -56 -56.34 0.2 56 9 | 0.2 56 9 -56 -56.34 |
3 | -1 3 2 1 0 -3 -2 | 3 2 1 0 -1 -3 -2 |
4 | -0.333 -1 0 1 0 -2 0 2 | 0 1 0 0 2 -0.333 -1 -2 |
5 | 9 -9 0 -96 -11 27 -13 | 9 0 27 -9 -96 -11 -13 |
Алгоритм решения
Считываем все действительные числа до конца входного потока и записываем их в один вектор. Создаем еще два вектора. В один из них будем записывать неотрицательные члены последовательности, содержащиеся в первом векторе, а в другой — отрицательные. Так как в условии задачи сказано, что сначала нужно вывести все неотрицательные члены последовательности, а затем — отрицательные, то к вектору с положительной частью последовательности добавляем в конец вектор с отрицательной частью последовательности и выводим результат.
Зачтено. Хотя, я так и не понял, почему Вы сразу не складываете в два вектора, а перекладываете из третьего?