Как найти сумму чисел, которые находятся между двумя заданными целыми числами в Java

#java #numbers

#java #числа

Вопрос:

Мне нужно написать метод суммы чисел, которые находятся между двумя заданными целыми числами.

Например, вызов sumNums(1,3) должен возвращать 6, потому что 1 2 3 = 6.

Вызов sumNums(3,1) также должен возвращать 6.

Пока у меня есть

 public static int sumNum(int num1, int num2)
{
   int min = Math.min(num1, num2);
   int max = Math.max(num1, num2);
   int sum = 0;
   for(int i = min; i < max; i  )
   {
       sum  = i;
   }
        sum =  max;
   return sum;
}
  

любые другие методы помогли бы, но если есть способ инициализировать сумму и вернуть ее, это помогло бы.

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

1. int sum = 0; ?

2. @Fredk да, я забыл это вставить. Это в.

3. @rgettman да, я вставил это.

Ответ №1:

 public static int sumNum(int num1, int num2) {
        int min = Math.min(num1, num2);
        int max = Math.max(num1, num2);
        int sum = 0;
        for (int i = min; i <= max; i  ) {
            sum  = i;
        }
        return sum;
    }
  

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

1. Я попробую это.

2. Да, но при вызове с 3, 1 произойдет сбой, потому что я не видел вашу правку

3. Вы можете попробовать это сейчас

4. Этот подход чрезвычайно неэффективен — вы можете вычислить результат без необходимости перебора набора значений (что занимает больше времени, чем больше диапазон).

5. @Jason вы должны добавить свой ответ, чтобы улучшить существующие ответы и показать эффективный способ

Ответ №2:

Честно используя java-8 IntStream

 IntStream.rangeClosed(1, 3).sum();    //6
  

используя java-7 и ниже

 public static int sumNum(int num1, int num2)
 {
    int min = Math.min(num1, num2);
    int max = Math.max(num1, num2);
    int sum = 0;
    for(int i = min; i <= max; i  )
     {
        sum  = i;
      }

    return sum;
}
  

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

1. У меня нет java-8

Ответ №3:

Это (простая) математика:

 public static int sumNum(int num1, int num2) {
   int min = Math.min(num1, num2);
   int max = Math.max(num1, num2);
   return max * (max   1) / 2 - min * (min - 1) / 2
}
  

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

1. Или ((max min) * (max 1-min))/2

2. (Простая) математика снова приходит на помощь!

Ответ №4:

Вы могли бы сделать что-то вроде этого:

 return (num1   num2) / 2.0 * (Math.abs(num1 - num2)   1);
  

Ответ №5:

Ваш текущий подход столкнется с проблемами производительности, чем больше разрыв между двумя целыми числами. Вы можете выполнить оптимизацию.

Например, если у вас нечетное количество целых чисел:

 2   3   4   5   6 = 4   4   4   4   4

1   2   3 = 2   2   2

5   6   7 = 6   6   6
  

Видите шаблон?

 2   3   4   5   6 = 4   4   4   4   4
                  = 5 * 4
                  = (max - min   1) * ((max   min) / 2)
  

Для четного числа целых чисел:

 2   3   4   5 = 3.5   3.5   3.5   3.5
              = 4 * 3.5

5   6   7   8   9   10 = 7.5   7.5   7.5   7.5   7.5   7.5
                       = 6 * 7.5
  

Выглядит знакомо! Давайте посмотрим, работает ли наша предыдущая формула:

 2   3   4   5 = (max - min   1) * ((max   min) / 2)
              = (5 - 2   1) * ((5   2) / 2)
              = 4 * 3.5
  

Формула может быть упрощена:

 (max - min   1) * ((max   min) / 2)  =  (max - min   1) * (max   min) / 2
  

Поэтому:

 public static int sumNum(int num1, int num2) {
    int min = Math.min(num1, num2);
    int max = Math.max(num1, num2);
    return (max - min   1) * (max   min) / 2;
}
  

Ответ №6:

Или используя математику, чтобы получить это за постоянное время:

 sum = max * (max   1) / 2 - (min * (min - 1)) /2;
  

Ответ №7:

Я не знаю, хотите ли вы изучать Java (итерации и потоки) или ищете хорошее решение реальной проблемы. В последнем случае ваша проблема представляет собой сумму членов арифметической прогрессии Арифметической прогрессии.
Сумма его членов, начинающихся с m по n , определяется product количеством членов (т.е.: m - n 1 ) и суммой первого и последнего членов, которые все делятся на 2:

 (max - min   1)*(min   max)/2
  

Ответ №8:

Не сильно отличается от других, но это было бы моим решением

 public static int sumNum(int num1, int num2) {
    if (num1 > num2) {
        int temp = num2;
        num2 = num1;
        num1 = temp;
    }
    return (num1   num2) * (num2   1 - num1) / 2;
}