#java
Задача состоит в том, чтобы вывести среднее из ряда чисел. Дается несколько рядов
чисел, каждый из которых оканчивается нулем, и этот ноль не должен использоваться в
решении (видимо, ноль в конце добавляют, чтобы удобно было разделять строки).
Проблема у меня в том, что значение, которое получаю в своем решении, незначительно
отличается от верного ответа для каждого ряда чисел (у меня значение получается больше).
Т.е. я упустил какую-то мелочь в своем алгоритме решения:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
LinkedList list = new LinkedList<>();
int result = 0;
int a;
for (int i = 0; i < 2; i++) {
do {
a = scanner.nextInt();
list.add(a);
for (Integer element : list) { //получаю сумму всех элементов
result += element;
}
result = result / list.size() - 1; // пытаюсь вычислить среднее
} while (a != 0);
System.out.print(result + " ");
list.clear();
result = 0;
}
}
P.S. Если в строке, где я пытаюсь вычислить среднее, list.size - 1 заключить в скобки,
то выдаст ArithmeticException.
Пример вводных данных :
401 1766 40 1011 313 1038 1346 2002 1966 335 55 679 0
348 468 214 286 221 169 363 490 1 358 265 0
Ответы
Ответ 1
Для получения среднего арифметического группы чисел нужно их сумму разделить на их количество. Причем делить нужно итоговую сумму на итоговое количество, а не после ввода каждого числа. В итоге код получается такой: Scanner scanner = new Scanner(System.in); for (int i = 0; i < 2; i++) { int sum = 0; int count = 0; int number = scanner.nextInt(); while (number != 0) { sum += number; count++; number = scanner.nextInt(); } System.out.print((sum / count) + " "); } Если нужно только среднее арифметическое, то сохранять все числа в список смысла нет. Если результат должен быть не целочисленным, то можно рассчитать его как double, например так: System.out.print((1.0 * sum / count) + " "); И наконец, если результат должен быть округлением точного значения до ближайшего целого числа, то можно воспользоваться Math.round: System.out.print(Math.round(1.0 * sum / count) + " "); Если же числа нужны для чего-то ещё, то можно добавлять их в список, а среднее арифметическое считать с использованием Stream-ов из Java 8: Scanner scanner = new Scanner(System.in); for (int i = 0; i < 2; i++) { Listnumbers = new ArrayList<>(); int number = scanner.nextInt(); while (number != 0) { numbers.add(number); number = scanner.nextInt(); } System.out.print(numbers.stream().mapToInt(e -> e).average().orElse(0) + " "); } И целочисленный вариант: System.out.print((int)numbers.stream().mapToInt(e -> e).average().orElse(0) + " "); Насчет java.lang.ArithmeticException: / by zero: на первой итерации у вас один элемент в списке. Соответственно, list.size() равен 1, и деление значения result на 1 с последующим вычитанием 1 проходит вполне успешно. Чего не сказать о случае result / (list.size() - 1), ибо в этом случае сначала из 1 вычитается 1, а потом происходит попытка разделить значение result на получившийся 0.
Комментариев нет:
Отправить комментарий