2016-08-30 23 views
-1

我有這個錯誤:sum = -1490928446.你看:負數。但我不知道是什麼?我 定義summation和a,我希望它可以計算「1 + 2!+ 3!+ ... + !?20」。我覺得我的代碼有沒有問題,但它告訴我負number.Why我該如何解決it.Thank你很much.Here是我的源代碼:我可以用Java來做「尋求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); 
} 

}

我想知道什麼邏輯錯誤?非常感謝。

+1

嘗試使用'long'或'BigInteger' – TheLostMind

+0

有一個在你的代碼另一個錯誤,'了'應該最外層循環內初始化。 –

回答

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 + ... 

哇!這甚至沒有接近同一件事。

我會讓你找出你出錯的地方。
這些打印語句將有助於此。
    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

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

int是32位,這意味着它只能容納這麼多。準確的範圍是-2^31 ~ 2^31-1。每Integer Overflow維基百科:

在計算機編程,當算術運算試圖創建一個數值,是太大而不能在可用存儲空間內表示發生整數溢出。

你的結果太大,它溢出並給你一個負面的結果。使用64位的long。試試這個:

long sum = 0L; 
long a = 1L; 
+0

aka https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#MAX_VALUE –

+1

當然@ScaryWombat,不知道我頭頂的數字,但範圍我知道(以指數表示法) – Li357

+0

非常感謝,我用你的方法。我解決了。 –

0

int在Java中的範圍從+2,147,483,647到-2,147,483,648。如果您的產量超出此範圍,則可以使用長度範圍從+9,223,372,036,854,775,807到-9,223,372,036,854,775,808的範圍。

如果您的輸出甚至比此更大,請嘗試使用BigInteger。但在你的情況下,只要解決它就足夠了。

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); 
} 
相關問題