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