我有这个错误:sum = -1490928446。你看:负数。但我不知道是什么?我 定义求和和a,我希望它可以计算“1 + 2!+ 3!+ ... + 20!”。我认为我的代码没有问题,但它告诉我负数。为什么?我怎么解决它。非常感谢。这是我的源代码:
public static void main(String[] args) {
//And to define a number of statistics accumulated result
int sum=0;
//An alternative definition of variable
int a=1;
//Two for loop
for(int j=1;j<21;j++)
{
for(int i=1;i<j+1;i++)
{
a=a*i;
sum +=a;
}
}
//Print output results
System.out.println("sum="+sum);
}
}
我想知道什么是逻辑错误?非常感谢。
答案 0 :(得分:2)
int
还不够。 int
(32位)的最高值可以是2^31 -1
,这意味着2147483647.您的总和超出此值。请改用long
。
long sum = 0;
long a = 1;
for (int j = 1; j < 21; j++) {
for (int i = 1; i < j + 1; i++) {
a = a * i;
sum += a;
}
}
System.out.println("sum=" + sum);
答案 1 :(得分:2)
int
是32位,这意味着它只能容纳这么多。准确地说,范围是-2^31 ~ 2^31-1
。来自维基百科的Integer Overflow:
在计算机编程中,当算术运算尝试创建一个太大而无法在可用存储空间中表示的数值时,会发生整数溢出。
你的结果太大而且溢出并且给你一个负面结果。使用64位的long
。试试这个:
long sum = 0L;
long a = 1L;
答案 2 :(得分:0)
int范围为+2,147,483,647到-2,147,483,648。如果您的输出超出此范围,您可以使用long,范围从+9,223,372,036,854,775,807到-9,223,372,036,854,775,808。
如果您的输出甚至大于此值,请尝试使用BigInteger。但在你的情况下,长期足以解决它。
答案 3 :(得分:0)
正如其他人所提到的那样,你的大小已经超过int
。更改为long
最多可以处理20个,但任何更高的值都会更新,此时您需要BigInteger
。
然而,你有比这更大的问题 你的主要问题是你的算法很糟糕。
你应该计算这个:
1 + 2 ! + 3 ! + 4 ! + 5 ! + ...
1 + 1*2 + 1*2*3 + 1*2*3*4 + 1*2*3*4*5 + ...
1 + 2 + 6 + 24 + 120 + ...
因此,让我们添加一些打印语句,看看你真正做了什么。请参阅下面的更新代码和输出。
1 + 1+2 + 2+4+12 + 12+24+72+288 + 288+576+1728+6912+34560 + ...
WOW!这甚至都不是同样的事情。
我会留给你找出你出错的地方。 1
这些印刷声明将有助于此
1)提示:删除i
循环。
代码的
int sum = 0;
int a = 1;
System.out.printf(" a=%-11d sum=%d%n", a, sum);
for (int j = 1; j < 21; j++) {
for(int i=1;i<j+1;i++) {
a = a * i;
sum += a;
System.out.printf("j=%-2d i=%-2d a=%-11d sum=%d%n", j, i, a, sum);
}
}
System.out.println("sum=" + sum);
输出
a=1 sum=0
j=1 i=1 a=1 sum=1
j=2 i=1 a=1 sum=2
j=2 i=2 a=2 sum=4
j=3 i=1 a=2 sum=6
j=3 i=2 a=4 sum=10
j=3 i=3 a=12 sum=22
j=4 i=1 a=12 sum=34
j=4 i=2 a=24 sum=58
j=4 i=3 a=72 sum=130
j=4 i=4 a=288 sum=418
j=5 i=1 a=288 sum=706
j=5 i=2 a=576 sum=1282
j=5 i=3 a=1728 sum=3010
j=5 i=4 a=6912 sum=9922
j=5 i=5 a=34560 sum=44482
j=6 i=1 a=34560 sum=79042
j=6 i=2 a=69120 sum=148162
j=6 i=3 a=207360 sum=355522
j=6 i=4 a=829440 sum=1184962
j=6 i=5 a=4147200 sum=5332162
j=6 i=6 a=24883200 sum=30215362
j=7 i=1 a=24883200 sum=55098562
j=7 i=2 a=49766400 sum=104864962
j=7 i=3 a=149299200 sum=254164162
j=7 i=4 a=597196800 sum=851360962
j=7 i=5 a=-1308983296 sum=-457622334
j=7 i=6 a=736034816 sum=278412482
j=7 i=7 a=857276416 sum=1135688898
在这里,您还可以在j=7, i=5
处看到您的溢出问题(第一次)。
答案 4 :(得分:0)
您的代码中存在错误。
我认为你应该在内循环中初始化a
。
一旦因子总和超过最大整数值,它就从负数开始。所以使用long
。
以下代码应该有效:
public static void main(String[] args) {
long sum = 0;
for (int j = 1; j < 21; j++) {
long a = 1;
for (int i = 1; i < j + 1; i++) {
a = a * i;
}
sum += a;
/*//checks when the sum exceeds the Maximum int value
* if(sum>Integer.MAX_VALUE){ System.out.println(sum+"---->"+j); }
*/
}
System.out.println("sum=" + sum);
}