我可以使用Java来“寻找1 + 2!+ 3!+ ... + 20!并且”?

时间:2016-08-30 05:06:24

标签: java eclipse

我有这个错误: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);
}

}

我想知道什么是逻辑错误?非常感谢。

5 个答案:

答案 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)

Java中的

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