#java
Задача состоит в том, чтобы вывести среднее из ряда чисел. Дается несколько рядов чисел, каждый из которых оканчивается нулем, и этот ноль не должен использоваться в решении (видимо, ноль в конце добавляют, чтобы удобно было разделять строки). Проблема у меня в том, что значение, которое получаю в своем решении, незначительно отличается от верного ответа для каждого ряда чисел (у меня значение получается больше). Т.е. я упустил какую-то мелочь в своем алгоритме решения: public static void main(String[] args) { Scanner scanner = new Scanner(System.in); LinkedListlist = 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.
Комментариев нет:
Отправить комментарий