Задача из сборника задач по программированию Абрамова С.А. 2000г.
Даны действительные числа [latex]a_{ 1 }[/latex],…,[latex]a_{ 20 }[/latex]. Получить числа [latex]b_{ 1 }[/latex],…,[latex]b_{ 20 }[/latex], где [latex]b_{ i }[/latex] – среднее арифметическое всех членов последовательности [latex]a_{ 1 }[/latex],…,[latex]a_{ 20 }[/latex], кроме [latex]a_{ i }[/latex] ([latex]i[/latex] = 1,2,…,20).
Обобщим задачу для последовательности длины [latex]n[/latex]
Даны действительные числа [latex]a_{ 1 }[/latex],…,[latex]a_{ n }[/latex]. Получить числа [latex]b_{ 1 }[/latex],…,[latex]b_{ n }[/latex], где [latex]b_{ i }[/latex] – среднее арифметическое всех членов последовательности [latex]a_{ 1 }[/latex],…,[latex]a_{ n }[/latex], кроме [latex]a_{ i }[/latex] ([latex]i[/latex] = 1,2,…,[latex]n[/latex]).
Входные данные:
Последовательность действительных чисел.
Выходные данные:
[latex]n[/latex] чисел, [latex]i[/latex]-ое из которых является средним арифметическим всех членов последовательности, кроме [latex]i[/latex]-го ([latex]i[/latex] = 1,2,…,[latex]n[/latex]).
Тесты
№ | Входные данные | Выходные данные |
1 | 4 | The sequence must consist of at least two elements. |
2 | 1 0 1 | The arithmetic average of all elements of this series except the element №i is: for i = 1: 0.5 for i = 2: 1 for i = 3: 0.5 |
3 | 10.1 2.4 11.3 0.8 | The arithmetic average of all elements of this series except the element №i is: for i = 1: 4.8(3) for i = 2: 7.4 for i = 3: 4.4(3) for i = 4: 7.9(3) |
4 | 2.5 -1.5 4 -9 1.22 | The arithmetic average of all elements of this series except the element №i is: for i = 1: -1.32 for i = 2: -0.32 for i = 3: -1.695 for i = 4: 1.555 for i = 5: -1 |
Код на 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 |
#include <iostream> #include <vector> using namespace std; int main() { vector <double> a, b; double cur, sum = 0; while(cin >> cur){ a.push_back(cur); sum += cur; } //Если последовательность состоит мене чем из двух элементов. if(a.size() < 2){ cout << "The sequence must consist of at least two elements."; } else{ //Заполняем вектор b. for(int i=0; i < a.size(); ++i){ b.push_back((sum - a[i])/(a.size() - 1)); } //Выводим ответ. cout << "The arithmetic average of all elements of this series except the element №i is:\n"; for(int i=0; i < b.size(); ++i){ cout << "for i = " << i+1 << ": " << b[i] << '\n'; } } return 0; } |
Код на Java
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 |
import java.util.*; class Main { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); Vector a,b; a = new Vector(); b = new Vector(); double cur, sum = 0; while(in.hasNext()){ cur = in.nextDouble(); a.add(cur); sum += cur; } //Если последовательность состоит только из одного числа. if(a.size() < 2){ System.out.print("The sequence must consist of at least two elements."); } else{ //Заполняем вектор b. for(int i=0; i < a.size(); ++i){ b.add((sum - (double)(a.elementAt(i)))/(a.size() - 1)); } //Выводим ответ. System.out.print("The arithmetic average of all elements of this series except the element №i is:\n"); for(int i=0; i < b.size(); ++i){ System.out.print("for i = " + (i+1) + ": " + b.elementAt(i) + '\n'); } } } } |
Решение
Для начала, в первом цикле мы читаем числа из входного потока, помещаем их в вектор
a и прибавляем к переменной
sum, предназначенной для хранения суммы всех чисел последовательности. Последовательность должна состоять как минимум из двух элементов. Чтобы получить среднее арифметическое всех её членов, кроме [latex]i[/latex]-го, достаточно отнять [latex]i[/latex]-й элемент вектора
a от значения переменной
sum и разделить результат на количество членов такой неполной последовательности, а оно будет на единицу меньше размера вектора
a. Таким образом заполняется вектор
b, в котором хранятся элементы последовательности [latex]b_{ 1 }[/latex],…,[latex]b_{ n }[/latex], после чего требуемая последовательность выводится.
Код на ideone.com (C++)
Код на ideone.com (Java)
Условие задачи (с.118)
Я зачел, но желательно чуть подправить В задании требуется из вектора a получить вектор b. Конечно, a можно ввести из входного потока, а b напечатать. Но b в программе отсутствует, а a назван v.
Спасибо, Игорь Евгеньевич, подправил.
Если в последовательности только один элемент, то среднее арифметическое всех элементов, кроме него не может быть определено. Т.е. последовательность должна состоять хотя бы из двух элементов. Или я не так понял?
Спасибо, Игорь Евгеньевич, этот момент я проглядел.