Страницы

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

среда, 4 марта 2020 г.

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

#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++) { 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.

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

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