Как найти сумму чисел, которые находятся между двумя заданными целыми числами в Java - PullRequest
0 голосов
/ 07 марта 2019

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

Например, вызов 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;
}

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

Ответы [ 8 ]

2 голосов
/ 07 марта 2019
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;
    }
2 голосов
/ 07 марта 2019

Честно говоря, используя 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 голос
/ 07 марта 2019

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

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

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;
}
1 голос
/ 07 марта 2019

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

return (num1 + num2) / 2.0 * (Math.abs(num1 - num2) + 1);
1 голос
/ 07 марта 2019

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

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
}
0 голосов
/ 07 марта 2019

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

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;
}
0 голосов
/ 07 марта 2019

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

(max - min + 1)*(min + max)/2
0 голосов
/ 07 марта 2019

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

sum = max * (max + 1) / 2 - (min * (min - 1)) /2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...