用于阶乘不正确输出的Java程序

时间:2017-09-04 10:16:52

标签: java eclipse vbscript factorial

我正在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。如果我取消注释并使用&#34; num&#34; for循环中的变量。我认为,对于每次迭代,与n的值相比,i的值会逐渐变化。相同的代码在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"

6 个答案:

答案 0 :(得分:6)

<强>爪哇:

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

答案 1 :(得分:5)

检查forloop i&lt; = n-1中的每次迭代。因为n一直在增加,所以for循环将一直运行,直到n达到最大可能的INTEGER数并变为负数。

答案 2 :(得分:2)

您没有将之前的乘法存储在另一个变量中,并且您的 n 总是在增加,因此 的条件 i < / strong>每次迭代都会改变。

答案 3 :(得分:2)

如上述答案中所述,对条件的评估会导致异常。您可以做的是保留一个单独的变量来检查循环中的条件,如下所示。

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

答案 4 :(得分:2)

它归结为何时读取数字与设置时相比:

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

java将做的是: 设置i = 1,执行检查i <= n-1(1&lt; = 5)然后执行大括号中的代码,然后递增i(i++)。 然后重复这个: 我现在等于2,在最后一次迭代中检查i <= n-1(2 <= 4)n已经改变,因此检查将使用新值。所以在下一次迭代n = 12

这会导致n的增长速度超过i,因此当超出整数容量导致n变为负值时,循环条件会解析为false。

答案是不要修改循环内循环条件中的值。

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

循环对VB的工作方式是计算循环开始和结束时的循环数,这意味着num只读了一次。

答案 5 :(得分:1)

您没有将先前的乘法存储在另一个变量中,而n始终在增加,因此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);    
 }  
} 


希望有助于。