簡體   English   中英

用於階乘不正確輸出的Java程序

[英]Java program for factorial incorrect output

我在Eclipse IDE中執行下面的Java代碼。

public class Programs {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int i, num, n;
        n = 6;
        // num=n-1;
        for (i = 1; i <= n - 1; i++) {
            n = n * i;
        }
        System.out.println("Factorial of the declared number is" + " " + n);
    }

}

它將輸出顯示為-1420957696。 如果我取消注釋並在for循環中使用“num”變量,代碼工作正常。 我認為,對於每次迭代,與i值相比, n的值逐漸變化。 相同的代碼在VBScript中工作正常(見下文)。 有人可以解釋這個區別嗎?

Option Explicit
Dim  i, num
num = InputBox("enter a number")
For i=1 To num-1
    num = num * i
Next
MsgBox "The factorial of entered number is: " & num, 3, "Program for factorial"

Java的:

n將會變得相當大。 i

因此, i <= n - 1將始終為true ,直到您的n溢出並回繞為負數。

一個修復方法是使用num來保存n的原始值,並使用i <= num - 1作為停止條件。


VBScript中:

在各種基礎知識(例如VBScript,VBA)中,在循環開始時有效地計算num-1 ,並且對num進一步調整對停止條件沒有影響。 您可以通過運行明確地看到這一點

Dim j
Dim i

j = 10
For i = 1 To j
    WScript.Echo i
    j = 1 'has no effect on the stopping condition.
Next

檢查forloop i <= n-1中的每次迭代。 因為n一直在增加,所以for循環將一直運行,直到n達到最大可能的INTEGER數並變為負數。

您沒有將先前的乘法存儲在另一個變量中,並且您的n總是在增加,因此for for i的條件會在每次迭代時更改。

如上述答案中所述,對條件的評估導致例外。 您可以做的是保留一個單獨的變量來檢查循環中的條件,如下所示。

int i,fact=1;  
  int number=5;//Number to calculate factorial    
  for(i=1;i<=number;i++){    
      fact=fact*i;    
  }   

它歸結為何時讀取數字與設置時相比:

n = 6;
for (i = 1; i <= n - 1; i++) {
    n = n * i;
}

java將要做的是:設置i = 1 ,檢查i <= n-1 (1 <= 5)然后執行大括號中的代碼,然后遞增i( i++ )。 然后重復這個:i現在等於2,檢查i <= n-1 (2 <= 4)n在最后一次迭代中發生了變化,因此檢查將使用新值。 所以在下一次迭代中n = 12

這導致ni增長得更快,因此當超過整數的容量時, n變為負值,循環條件解析為false。

答案是不要在循環內修改循環條件中的值。

n = 6;
num = n - 1;
for (i = 1; i <= num; i++) {
    n = n * i;
}

循環對VB的工作方式是通過計算循環啟動時循環開始和結束的數字,這意味着num只讀取一次。

您沒有將先前的乘法存儲在另一個變量中,並且您的n總是在增加,因此for i的條件會在每次迭代時更改。

相反,您可以使用單獨的變量來保存您的factorial

class FactorialExample{  
 public static void main(String args[]){  
  int i,fact=1;  
  int number=5;//It is the number to calculate factorial    
  for(i=1;i<=number;i++){    
      fact=fact*i;    
  }    
  System.out.println("Factorial of "+number+" is: "+fact);    
 }  
} 


希望有助於。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM