Условие
Даны целые числа [latex]a_1, \ldots , a_{100}[/latex]. Получить новую последовательность из 100 целых чисел, заменяя [latex]a_i[/latex] нулями, если [latex]|a_i|[/latex] не равно [latex]\text{max} (a_1, \ldots , a_{100})[/latex], и заменяя [latex]a_i[/latex] единицей в противном случае ([latex]i = 1, \ldots , 100[/latex]).
Ниже приведено решение для общего случая, когда количество чисел произвольно.
Тестирование
№ | Входные данные | Выходные данные |
1 | 0 | 1 |
2 | 1 0 -1 | 1 0 1 |
3 | -1 0 -1 | 0 1 0 |
4 | -1 -1 -1 | 0 0 0 |
5 | 4 4 4 4 | 1 1 1 1 |
6 | 10 5 -1 -10 -20 0 1 2 3 | 1 0 0 1 0 0 0 0 0 |
Код
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> #include <cmath> using namespace std; int main() { vector<int> x; int t; cin >> t; // Читаем и помещаем в вектор первое число, считая его максимумом int max = t; x.push_back(t); while(cin >> t) { // Заполняем вектор оставшимися числами x.push_back(t); if(t > max) // Если очередной элемент больше текущего максимума, обновляем максимум max = t; } for(int i = 0; i < x.size(); i++) // Обрабатываем вектор в соответствии с условием x.at(i) = abs(x.at(i)) != max ? 0 : 1; for(int i = 0; i < x.size(); i++) // Печатаем вектор cout << x.at(i) << ' '; return 0; } |
Решение
В первую очередь отметим, что решить задачу потоковой обработкой невозможно, так как для обработки последовательности нужно знать значение ее максимального элемента, который, в свою очередь, можно вычислить только получив всю последовательность целиком.
Так как последовательность состоит из целых чисел и ее длина неизвестна, воспользуемся классом vector типа int:
1 |
vector<int> x; |
Затем отдельно считаем первый элемент последовательности и возьмем его в качестве максимума, после чего поместим в вектор:
1 2 3 4 |
int t; cin >> t; int max = t; x.push_back(t); |
Заполним вектор оставшимися числами, попутно обновляя переменную max , если встретим число, большее хранимого максимума:
1 2 3 4 5 |
while(cin >> t) { x.push_back(t); if(t > max) max = t; } |
Теперь обработаем последовательность согласно условию задачи, то есть заменим каждое число либо нулем, если его абсолютное значение не равно максимуму, либо единицей в противном случае:
1 2 |
for(int i = 0; i < x.size(); i++) x.at(i) = abs(x.at(i)) != max ? 0 : 1; |
Наконец, выведем ответ на задачу — полученную последовательность из нулей и единиц:
1 2 |
for(int i = 0; i < x.size(); i++) cout << x.at(i) << ' '; |
Ссылки
Код программы на Ideone.com;
Условие задачи в сборнике задач по программированию (С. А. Абрамов).
Хорошо. Принято.