#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;
}