我正在eclipseide中执行下面的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”变量,代码工作正常。我认为每一次迭代 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条答案
按热度按时间vshtjzan1#
java 语:
n
会有相当大的cf。i
.因此
i <= n - 1
永远都是true
,直到n
溢出并环绕到负值。一个解决办法是使用
num
保持原值n
,并使用i <= num - 1
作为停车条件。vbscript:
在各种基础知识(如vbscript、vba)中,
num-1
在循环开始时有效地计算,并进一步调整num
对停车条件没有影响。通过运行ev7lccsx2#
你没有把以前的乘法存储在另一个变量中,你的n总是在增加,所以i的条件每次迭代都会改变。
slhcrj9b3#
它归结为读取数字的时间与设置数字的时间:
java将要做的是:设置
i = 1
,进行检查i <= n-1
(1<=5)然后执行大括号中的代码,然后递增i(i++
). 然后重复:i等于2,进行检查i <= n-1
(2<=4)n在上一次迭代中已更改,因此检查将使用新值。所以在下一次迭代中n = 12
.这导致
n
比…长得快i
所以当超过整数的容量时n
若为负,循环条件将解析为false。答案是不要在循环中修改循环条件中的值。
vb中循环的工作方式是在循环开始时计算循环开始和结束的数字,这意味着
num
只读过一次。ws51t4hk4#
对forloop i<=n-1中的每次迭代进行检查。因为n一直在增加,所以for循环将一直运行,直到n达到可能的最大整数数并变为负数。
iq0todco5#
如上所述,条件评估导致异常。您可以做的是保留一个单独的变量来检查循环中的条件。
qc6wkl3g6#
您没有将先前的乘法存储在另一个变量中,并且
n
总是在增加所以i
每次迭代都会更改。相反,您可以使用单独的变量来保存
factorial
.希望有帮助。