我创建了一个方法,它将在两个给定数字之间添加所有数字的总和,但由于某种原因它不起作用。
public static int sumOfAll(int one, int two)
{
int bigNumber;
int smallNumber;
if(one < two){
bigNumber = two;
smallNumber = one;
}
else{
bigNumber = one;
smallNumber = two;
}
return ((smallNumber + bigNumber) / 2) * (bigNumber - smallNumber + 1);
}
这就是方法,这就是我声明方法的方法。
System.out.println(MathOp.sumOfAll(100, 1));
由于某种原因,打印的结果是5000,当它应该是5050.我使用的算法是正确的我在wolframalpha上测试它。我不知道为什么它不在这里工作,任何帮助都会很棒!
答案 0 :(得分:3)
public static int sumOfAll(int one, int two)
{
int bigNumber=Math.max(one,two);
int smallNumber=Math.min(one,two);
return ((bigNumber+1-smallNumber)*(bigNumber+smallNumber))/2;
}
答案 1 :(得分:1)
为什么不使用求和公式?
http://en.wikipedia.org/wiki/Summation
http://upload.wikimedia.org/math/a/7/4/a74f603449dc34d308b50bbb6acaba1a.png
为此,只需将您的返回代码更改为
return (bigNumber*(bigNumber+1)-smallNumber*(smallNumber-1))/2;
答案 2 :(得分:0)
return (int)(((double)(smallNumber + bigNumber) / 2) * (bigNumber - smallNumber + 1));
原因是
正如@devnull指出的那样,当你执行((smallNumber + bigNumber) / 2)
时,小数部分会被删除,因为它们被转换为int
。因此在进行乘法之前需要显式转换为(double)
答案 3 :(得分:0)
您可以尝试将int更改为double
public static double sumOfAll(int one, int two)
{
double bigNumber;
double smallNumber;
if (one < two)
{
bigNumber = two;
smallNumber = one;
}
else
{
bigNumber = one;
smallNumber = two;
}
return ((smallNumber + bigNumber) / 2) * (bigNumber - smallNumber + 1);
}
答案 4 :(得分:0)
首先,您不需要添加更多代码行,更改方法的返回类型或更改算法。
<强>背景强>
在划分数字时,在某些情况下,结果为整数。例如2/1 = 2或33/11 = 3.在其他情况下,结果不是整数,如3/2 = 1.5或10/9 = 1.11 ...
在JAVA中,如果尝试使用全数字的数字进行算术运算,结果将产生整数值。例如,2 + 3/5 = 2 + 0.6 。但由于3和5都是整数,JAVA会自动截断结果的小数部分。最后是2 + 0 = 2。
如何解决此问题?
由于您的方法计算“从a到b的数字的包含总和”,因此已知结果将产生整数值。但是return语句包含可能产生双精度值的算术运算。在这种情况下,您可以通过在数字末尾添加“.0”来强制结果获取双倍值,在本例中为2和1:
return ((smallNumber + bigNumber) / 2) * (bigNumber - smallNumber + 1);
那就变成了:
return ((smallNumber + bigNumber) / 2.0) * (bigNumber - smallNumber + 1.0);
由于该方法必须返回整数,因此必须将返回值转换为整数:
return (int) (((smallNumber + bigNumber) / 2.0) * (bigNumber - smallNumber + 1.0));
<强>结果强>
public static int sumOfAll(int one, int two){
int bigNumber;
int smallNumber;
if(one < two){
bigNumber = two;
smallNumber = one;
}
else{
bigNumber = one;
smallNumber = two;
}
return (int) (((smallNumber + bigNumber) / 2.0) * (bigNumber - smallNumber + 1.0));
}
某些输入和输出
输入:sumOfAll(100,1)---------------------输出:5050
输入:sumOfAll(25,5)-----------------------输出:315
输入:sumOfAll(1000,100)-----------------输出:495550
输入:sumOfAll(80,3)-----------------------输出:3237
输入:sumOfAll(7795,7)--------------------输出:30384889