Имеется три числа: 10, 20, 30. Как найти среднее из них (не самое большое и не самое маленькое), без множества условий?
Asked
Active
Viewed 1.4k times
4
-
А у вас математика в школе была уже? Там про среднее арифметическое рассказывали? – Владимир Мартьянов Aug 30 '17 at 11:01
-
3@ВладимирМартьянов, а в вопросе про среднее арифметическое и не спрашивают :) – Grundy Aug 30 '17 at 11:02
-
именно для 3 чисел? – Nikolai Aug 30 '17 at 11:03
-
@Nikolay, да, для трех – Sergei Mikhailovskii Aug 30 '17 at 11:10
-
2Немного не ясен вопрос: вы хотите среднее по положению или которое наиболее близкое к среднеарифметическому? – Barmaley Aug 30 '17 at 11:19
-
@ВладимирМартьянов: вопрос о median, а не mean. Связанный вопрос Minimum no. of comparisons to find median of 3 numbers – jfs Aug 31 '17 at 10:10
10 Answers
11
Отсортировать и взять среднее.
public static void main(String[] args) {
int[] numbers = new int[] {31, 6, 13};
Arrays.sort(numbers);
System.out.println(numbers[1]);
}
DaysLikeThis
- 1,798
4
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);
3
Можно через условие тернарными операторами
int mid = (a > b)? ((c<b)?b:((c<a)?c:a)): ( (a>c)?a:(b>c)?c:b);
nick_n_a
- 8,057
1
решение без сортировки, используя сравнение
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);
}
0
Вот что-то похожее решил на codewars
import static java.util.stream.IntStream.of;
interface Kata {
static double find_average(int[] array) {
return of (array).average().orElse(3);
}
}
Valery
- 1
-
1пожалуйста, оставляйте чуть более развёрнутые ответы. постарайтесь рассказать обо всех нюансах, которые могут возникнуть при решении проблемы по вашему сценарию. изложите свои предложения. возможен и краткий ответ, но чем подробнее и понятнее он будет изложен, тем лучше. дополнить ответ можно, нажав [edit] – aleksandr barakin Apr 16 '21 at 04:47
0
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scr = new Scanner (System.in);
int x = scr.nextInt();
int y = scr.nextInt();
int z = scr.nextInt();
if ((x >= y & x <= z) || (x <= y & x >= z)) {
System.out.print(x);
} else if ((y >= x & y <= z) || (y <= x & y >= z)){
System.out.println(y);
} else
System.out.println(z);
}
}
-
добро пожаловать на Stack Overflow на русском! пожалуйста, постарайтесь оставлять чуть более развёрнутые ответы. дополнить ответ можно, нажав [edit] – aleksandr barakin Sep 08 '23 at 08:11
0
Держи ещё вариант с одним ифом, а не несколькими:
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);
}
}
Agrgg
- 1,308
0
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])));
slippyk
- 6,161
0
Вам в любом случае придется использовать условия - пусть даже внешне они будут скрыты в вызовах готовых методов для сортировки (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);
}
Nikolai
- 3,312
-
есть решение без ветвления, используя только min, max, которые могут использовать SSE min/max CPU векторные инструкции (код @Gyorgy Szekely) – jfs Sep 06 '17 at 08:34
0
Решение, используя сеть сортировки, построенной на основе метода пузырьков, из ответа @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
jfs
- 52,361