Как найти среднее число в джава

Имеется три числа: 10, 20, 30. Как найти среднее из них (не самое большое и не самое маленькое), без множества условий?

jfs's user avatar

jfs

51.8k11 золотых знаков107 серебряных знаков306 бронзовых знаков

задан 30 авг 2017 в 11:00

Sergei Mikhailovskii's user avatar

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

DaysLikeThis's user avatar

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's user avatar

Nikolai

3,2928 серебряных знаков18 бронзовых знаков

ответ дан 30 авг 2017 в 11:12

Montego's user avatar

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_a's user avatar

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's user avatar

insolor

45.6k16 золотых знаков54 серебряных знака95 бронзовых знаков

ответ дан 19 мар 2020 в 7:17

Andry's user avatar

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

Agrgg's user avatar

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

slippyk's user avatar

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

jfs's user avatar

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

Nikolai's user avatar

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

Valery's user avatar

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. Изображение с названием Write a Program in Java to Calculate the Mean Step 1

    1

    Напишите план программы. Планирование – это очень важный шаг. Подумайте о том, где будет использоваться данная программа. Эта программа будет работать с очень большими числами? Если да, то вы можете решить, использовать ли такие типы данных, как long вместо int.

    • Попробуйте вычислить среднюю величину ряда чисел самостоятельно. Это поможет вам понять принцип действия программы.
  2. 2

    Напишите код. Чтобы вычислить среднюю величину, вам понадобятся следующие параметры:

    Изображение с названием Write a Program in Java to Calculate the Mean Step 2
    • Сумма всех введенных пользователем чисел
      • К примеру, если сумма введенных чисел = 100, а количество чисел = 10, то средняя величина =100 / 10 = 10
    • Таким образом , формула вычисления средней величины:

      Средняя величина = сумма всех чисел /количество чисел.

    • Чтобы получить эти данные, используйте функцию «Scanner» в Java.
      • Вам потребуется получить большое количество пользовательских данных из которых вам нужно вычислить среднюю величину. Для этого попробуйте использовать цикл. В примере кода ниже используется цикл «for». Также вы можете попробовать использовать цикл «while».
  3. Изображение с названием Write a Program in Java to Calculate the Mean Step 3

    3

    Вычислите среднюю величину. Используя формулу, приведенную выше, напишите код для вычисления средней величины. Убедись в том, что переменная, используемая для сохранения значения «средней величины» имеет тип «float». Иначе ответ может быть неправильным.

    • Это происходит потому, что тип данных «float» это 32 битное число одинарной точности, которое даже считает десятичные в математических вычислениях. Таким образом, при использовании переменною типа float, ответ для математического действия 5 / 2 (5 делить на 2) будет 2.5.
      • Если такое же вычисление (5 / 2) будет выполняться при помощи переменной типа «int», ответ будет 2.
      • Однако, переменные, в которых вы сохраняете «сумму» и «количество значений», могут иметь тип «int». Используя переменную типа «float» для «средней величины» автоматически изменит её тип с «int» на «float»; и все вычисление будет выполняться в float вместо int.
  4. Изображение с названием Write a Program in Java to Calculate the Mean Step 4

    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.

Понравилась статья? Поделить с друзьями:
  • Как найти объем растворенного вещества
  • Как найти номер сотового у друга
  • Как найти название музыкального инструмента
  • Как составить сертификат на подарок
  • Как найти айди стикера в телеграмме