我需要编写一个两个给定整数之间的数字之和的方法。
例如,调用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;
}
任何其他方法都会有所帮助,但如果有办法初始化总和并返回它会有所帮助。
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;
}
老实说使用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;
}
这是(简单)数学:
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
}
你可以这样做:
return (num1 + num2) / 2.0 * (Math.abs(num1 - num2) + 1);
您当前的方法会遇到性能问题,两个整数之间的差距越大。您可以进行优化。
例如,如果您有一个奇数个整数:
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;
}
或者使用数学来恒定地获取它:
sum = max * (max + 1) / 2 - (min * (min - 1)) /2;
我不知道你是否想学习Java(迭代和流),或者你是否正在寻找一个真正问题的好解决方案。在后一种情况下,您的问题是算术级数Arithmetic progression的项的总和。
从m
到n
的术语总和由product
给出的术语数量(即:m - n +1
)和第一个和最后一个术语的总和除以2:
(max - min + 1)*(min + max)/2
与其他人没什么不同,但这将是我的解决方案
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;
}