Имеется три числа: 10, 20, 30. Как найти среднее из них (не самое большое и не самое маленькое), без множества условий?
jfs
51.8k11 золотых знаков107 серебряных знаков306 бронзовых знаков
задан 30 авг 2017 в 11:00
6
Отсортировать и взять среднее.
public static void main(String[] args) {
int[] numbers = new int[] {31, 6, 13};
Arrays.sort(numbers);
System.out.println(numbers[1]);
}
ответ дан 30 авг 2017 в 11:09
0
int max = Math.max(Math.max(a,b), c);
int min = Math.min(Math.min(a,b), c);
int mid = a + b + c - (min + max);
Nikolai
3,2928 серебряных знаков18 бронзовых знаков
ответ дан 30 авг 2017 в 11:12
MontegoMontego
10310 бронзовых знаков
2
Можно через условие тернарными операторами
int mid = (a > b)? ((c<b)?b:((c<a)?c:a)): ( (a>c)?a:(b>c)?c:b);
ответ дан 30 авг 2017 в 11:19
nick_n_anick_n_a
7,9191 золотой знак21 серебряный знак66 бронзовых знаков
0
решение без сортировки, используя сравнение
int a = scanner.nextInt();
int b = scanner.nextInt();
int c = scanner.nextInt();
if ((a - b) * (c - a) >= 0) { // a >= b and a <= c OR a <= b and a >= c
System.out.print(a);
} else if ((b - a) * (c - b) >= 0) { // b >= a and b <= c OR b <= a and b >= c
System.out.print(b);
} else {
System.out.print(c);
}
insolor
45.6k16 золотых знаков54 серебряных знака95 бронзовых знаков
ответ дан 19 мар 2020 в 7:17
AndryAndry
113 бронзовых знака
Держи ещё вариант с одним ифом, а не несколькими:
private int middleOfThree(int[] input) {
int x = Math.max(input[0], input[1]);
int y = Math.max(input[0], input[2]);
if (x == y) {
return Math.max(input[1], input[2]);
} else {
return Math.min(x, y);
}
}
ответ дан 30 авг 2017 в 11:20
AgrggAgrgg
1,3088 серебряных знаков11 бронзовых знаков
import static java.lang.Math.*;
int[] digits = {20, 10, 30};
System.out.println(max(max(min(digits[0], digits[1]), min(digits[1], digits[2])), min(digits[0], digits[2])));
ответ дан 30 авг 2017 в 11:34
slippykslippyk
6,0913 золотых знака19 серебряных знаков38 бронзовых знаков
1
Решение, используя сеть сортировки, построенной на основе метода пузырьков, из ответа @Gyorgy Szekely:
int median = Math.max(Math.min(a, b), Math.min(Math.max(a, b), c));
Полный пример:
public class MedianOf3 {
public static void main(String[] argv) {
System.out.println(median(10, 20, 30));
}
public static int median(int a, int b, int c) {
return Math.max(Math.min(a, b), Math.min(Math.max(a, b), c));
}
}
Вывод:
20
См. Fastest way of finding the middle value of a triple?
ответ дан 31 авг 2017 в 10:38
jfsjfs
51.8k11 золотых знаков107 серебряных знаков306 бронзовых знаков
Вам в любом случае придется использовать условия — пусть даже внешне они будут скрыты в вызовах готовых методов для сортировки (Collections.sort
, Arrays.sort
и т.п.) или получения мин./макс. значений (Math.min
, Math.max
и т.п.). Лучше написать простенькую функцию с парой условий — это гарантированно будет работать быстрее.
private static int getMed(int a, int b, int c) {
return (a >= b && a <= c) || (a <= b && a >= c) ? a :
((b >= a && b <= c) || (b <= a && b >= c) ? b : c);
}
ответ дан 30 авг 2017 в 11:46
NikolaiNikolai
3,2928 серебряных знаков18 бронзовых знаков
1
Вот что-то похожее решил на codewars
import static java.util.stream.IntStream.of;
interface Kata {
static double find_average(int[] array) {
return of (array).average().orElse(3);
}
}
ответ дан 16 апр 2021 в 4:43
1
В нашей жизни мы далеко не всегда используем точные цифры, да это и не каждый раз удобно. Некоторые результаты обобщают, выражая среднее значение, особенно когда речь идет о статистике, прогнозах и отчетах. Это может быть и среднее время в пути, и средняя успеваемость ученика, и средняя заработная плата на предприятии, и средняя температура по больнице (в последнем примере мы, разумеется, шутим). Но как бы там не было, мы должны знать, как быстро и точно посчитать среднее арифметическое число. Об этом — наша статья. Дополнительно рассмотрим на примерах, как вычисляет среднее арифметическое число компилятор языка программирования Java.
На практике формулу о том, как найти или вычислить среднее арифметическое, изучают в пятом классе. Что же, давайте освежим знания, полученные в далеком (а для кого-то и в недалеком) детстве.
Что такое среднее арифметическое? Формула нахождения числа
Средним арифметическим некоторого множества чисел называют сумму всех этих чисел, разделенных на общее количество слагаемых. То есть искомое значение вычисляет следующая формула:
В примере ниже мы считаем среднее арифметическое трех простейших чисел:
- 2,
- 3,
- 4.
Давайте обозначим сре днее арифметическое латинской буквой «m» и вычислим сумму вводимых чисел:
2 + 3 + 4 = 9.
А чтобы рассчитать среднее арифмети ческое, останется разделить эту сумму на три. Таким образом, формулу нахождения можно представить следующим образом:
И все? Так просто?
И да, и нет. Если углубляться в математику, мы узнаем, что существуют различные способы вычисления, однако мы не будем усложнять вышесказанное и ограничимся стандартной формулой:
Что здесь что:
- x — это наше среднее арифметическое;
- xn — конкретное значение числа;
- n — общее количество значений.
У такой формулы есть много плюсов:
- прекрасный выбор при нормальном распределении значений в существующей выборке;
- интуитивная доступность;
- посчитать легко и просто.
Однако с математической точки зрения тут существуют и минусы:
- используя эту формулу, довольно сложно представить распределение введенных значений;
- есть вероятность запутаться в различных величинах.
Теперь давайте посмотрим, как расчет среднего числа может выглядеть в программном коде. Заодно и проверим пример выше ;-):
public class Main {
public static void main(String[] args) {
int[] nums = {2, 3, 4};
int result = 0;
for (int m : nums) {
result += m;
}
System.out.println(«Значение среднего арифметического равно: » + result / nums.length);
}
}
Можно было легко догадаться, что мы получим 3, значит вышеописанная формула нахождения среднего арифметического числа находит правильный результат.
На деле вы можете ввести в код выше какие угодно значения чисел, а также изменить количество введенных чисел. Однако если надо вычислить более точный результат (это особенно актуально для ввода ряда чисел с десятичным значением), тип данных в Java надо будет изменить на double:
Источники:
- https://skysmart.ru/articles/mathematic/kak-najti-srednee-arifmeticheskoe;
- https://www.examclouds.com/ru/java/java-core-russian/srednee-arifmeticheskoye.
Все это выглядит чрезвычайно просто. Если же вы ищете действительно сложные и продвинутые решения по Java-программированию, обратите внимание на программу Java-курса в Otus:
Загрузить PDF
Загрузить PDF
Вычисление средней величины – важно в повседневной жизни. Средняя величина или среднее арифметическое значение используется во многих математических операциях, и очень важно уметь это вычислять. Но, при работе с большими числами, гораздо проще использовать специальную программу. Здесь вы прочитаете, как самостоятельно написать программу на Java, чтобы вычислить среднюю величину.
Шаги
-
1
Напишите план программы. Планирование – это очень важный шаг. Подумайте о том, где будет использоваться данная программа. Эта программа будет работать с очень большими числами? Если да, то вы можете решить, использовать ли такие типы данных, как long вместо int.
- Попробуйте вычислить среднюю величину ряда чисел самостоятельно. Это поможет вам понять принцип действия программы.
-
2
Напишите код. Чтобы вычислить среднюю величину, вам понадобятся следующие параметры:
- Сумма всех введенных пользователем чисел
- К примеру, если сумма введенных чисел = 100, а количество чисел = 10, то средняя величина =100 / 10 = 10
- Таким образом , формула вычисления средней величины:
Средняя величина = сумма всех чисел /количество чисел.
- Чтобы получить эти данные, используйте функцию «Scanner» в Java.
- Вам потребуется получить большое количество пользовательских данных из которых вам нужно вычислить среднюю величину. Для этого попробуйте использовать цикл. В примере кода ниже используется цикл «for». Также вы можете попробовать использовать цикл «while».
- Сумма всех введенных пользователем чисел
-
3
Вычислите среднюю величину. Используя формулу, приведенную выше, напишите код для вычисления средней величины. Убедись в том, что переменная, используемая для сохранения значения «средней величины» имеет тип «float». Иначе ответ может быть неправильным.
- Это происходит потому, что тип данных «float» это 32 битное число одинарной точности, которое даже считает десятичные в математических вычислениях. Таким образом, при использовании переменною типа float, ответ для математического действия 5 / 2 (5 делить на 2) будет 2.5.
- Если такое же вычисление (5 / 2) будет выполняться при помощи переменной типа «int», ответ будет 2.
- Однако, переменные, в которых вы сохраняете «сумму» и «количество значений», могут иметь тип «int». Используя переменную типа «float» для «средней величины» автоматически изменит её тип с «int» на «float»; и все вычисление будет выполняться в float вместо int.
- Это происходит потому, что тип данных «float» это 32 битное число одинарной точности, которое даже считает десятичные в математических вычислениях. Таким образом, при использовании переменною типа float, ответ для математического действия 5 / 2 (5 делить на 2) будет 2.5.
-
4
Выведите на экран результат. Когда программа вычислит среднюю величину, покажите ее пользователю. В Java для этого спользуйте функцию System.out.print или System.out.println (чтобы печатать на новой строке).
Реклама
Пример кода
import java.util.Scanner; public class main_class { public static void main(String[] args){ int sum = 0, inputNum; int counter; float mean; Scanner NumScanner = new Scanner(System.in); Scanner charScanner = new Scanner(System.in); System.out.println("Enter the total number of terms whose mean you want to calculate"); counter = NumScanner.nextInt(); System.out.println("Please enter " + counter + " numbers:"); for(int x = 1; x<=counter ;x++){ inputNum = NumScanner.nextInt(); sum = sum + inputNum; System.out.println(); } mean = sum / counter; System.out.println("The mean of the " + counter + " numbers you entered is " + mean); } }
import java.util.Scanner; /* *Эта система ввода позволяет пользователю вводить *числа, пока не будут введены все необходимые данные. *Командная строка используется, чтобы программа распознала, *когда пользователь ввел данные. *Integer.parseInt (строка s) возвращает к числу, которое *содержит строка (т.е. Integer.parseInt("462")==462). * *Важно отметить: используя этот метод для ввода переменных, *нельзя сравнивать строки "==" or "!=". Иначе, *строки сравниваются, основываясь на их расположении в памяти компьютера. *s.equals(строка t) показывает, если содержимое строк *одинаково. !s.equals(String t) показывает, если содержание строк *разное. */ public class main_class { public static void main(String[] args){ String sentinel = ""; int sum = 0; int counter = 0; double mean = 0.0; Scanner NumScanner = new Scanner(System.in); System.out.println("Enter numbers to add. Enter "d" when done."); System.out.print("Enter number: "); sentinel = NumScanner.next(); System.out.println(); while(!sentinel.equals("d") && !sentinel.equals("D")) { sum += Integer.parseInt(sentinel); counter++; System.out.print("Enter number: "); sentinel = NumScanner.next(); System.out.println(); } mean = (sum*1.0)/counter; System.out.println(); System.out.println("The arithmetic mean is: " + mean +"."); } }
Советы
- Попробуйте использовать программу для выполнения многочисленных математических операций.
- Попробуйте изменить графический интерфейс, чтобы программа стала более красочной и легкой в использовании.
Реклама
Об этой статье
Эту страницу просматривали 15 553 раза.
Была ли эта статья полезной?
Средним арифметическим множества чисел называют сумму всех этих чисел, разделенных на общее количество слагаемых. В Java найти среднее арифметическое можно при помощи цикла или используя стримы. Рассмотрим пример с циклом:
class App {
public static double average(int[] numbers) {
var length = numbers.length;
var sum = 0;
// Находим сумму всех чисел
for (double num : numbers) {
sum += num;
}
// И делим её на количество слагаемых
return sum / length;
}
}
App.average(new int[] {1, 2, 3}); // 2.0
Также можно использовать стримы. Рассмотрим вариант на стримах
import java.util.Arrays;
class App {
public static double average(int[] numbers) {
Arrays.stream(numbers).average().getAsDouble();
}
}
App.average(new int[] {1, 2, 3}); // 2.0
When the number is not big, everything seems just right. But if it isn’t, great caution is required to achieve correctness.
Take double as an example:
If it is not big, as others mentioned you can just try this simply:
doubles.stream().mapToDouble(d -> d).average().orElse(0.0);
However, if it’s out of your control and quite big, you have to turn to BigDecimal as follows (methods in the old answers using BigDecimal actually are wrong).
doubles.stream().map(BigDecimal::valueOf).reduce(BigDecimal.ZERO, BigDecimal::add)
.divide(BigDecimal.valueOf(doubles.size())).doubleValue();
Enclose the tests I carried out to demonstrate my point:
@Test
public void testAvgDouble() {
assertEquals(5.0, getAvgBasic(Stream.of(2.0, 4.0, 6.0, 8.0)), 1E-5);
List<Double> doubleList = new ArrayList<>(Arrays.asList(Math.pow(10, 308), Math.pow(10, 308), Math.pow(10, 308), Math.pow(10, 308)));
// Double.MAX_VALUE = 1.7976931348623157e+308
BigDecimal doubleSum = BigDecimal.ZERO;
for (Double d : doubleList) {
doubleSum = doubleSum.add(new BigDecimal(d.toString()));
}
out.println(doubleSum.divide(valueOf(doubleList.size())).doubleValue());
out.println(getAvgUsingRealBigDecimal(doubleList.stream()));
out.println(getAvgBasic(doubleList.stream()));
out.println(getAvgUsingFakeBigDecimal(doubleList.stream()));
}
private double getAvgBasic(Stream<Double> doubleStream) {
return doubleStream.mapToDouble(d -> d).average().orElse(0.0);
}
private double getAvgUsingFakeBigDecimal(Stream<Double> doubleStream) {
return doubleStream.map(BigDecimal::valueOf)
.collect(Collectors.averagingDouble(BigDecimal::doubleValue));
}
private double getAvgUsingRealBigDecimal(Stream<Double> doubleStream) {
List<Double> doubles = doubleStream.collect(Collectors.toList());
return doubles.stream().map(BigDecimal::valueOf).reduce(BigDecimal.ZERO, BigDecimal::add)
.divide(valueOf(doubles.size()), BigDecimal.ROUND_DOWN).doubleValue();
}
As for Integer
or Long
, correspondingly you can use BigInteger
similarly.