Страницы

Поиск по вопросам

понедельник, 20 мая 2019 г.

Расхождение результата с верным при вычислении среднего из ряда чисел

Задача состоит в том, чтобы вывести среднее из ряда чисел. Дается несколько рядов чисел, каждый из которых оканчивается нулем, и этот ноль не должен использоваться в решении (видимо, ноль в конце добавляют, чтобы удобно было разделять строки).
Проблема у меня в том, что значение, которое получаю в своем решении, незначительно отличается от верного ответа для каждого ряда чисел (у меня значение получается больше).
Т.е. я упустил какую-то мелочь в своем алгоритме решения:
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


Ответ

Для получения среднего арифметического группы чисел нужно их сумму разделить на их количество. Причем делить нужно итоговую сумму на итоговое количество, а не после ввода каждого числа.
В итоге код получается такой:
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++) { List numbers = 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

Комментариев нет:

Отправить комментарий