java程序

hjzp0vay  于 2021-07-03  发布在  Java
关注(0)|答案(6)|浏览(305)

我正在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"
vshtjzan

vshtjzan1#

java 语: n 会有相当大的cf。 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
ev7lccsx

ev7lccsx2#

你没有把以前的乘法存储在另一个变量中,你的n总是在增加,所以i的条件每次迭代都会改变。

slhcrj9b

slhcrj9b3#

它归结为读取数字的时间与设置数字的时间:

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 .
这导致 n 比…长得快 i 所以当超过整数的容量时 n 若为负,循环条件将解析为false。
答案是不要在循环中修改循环条件中的值。

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

vb中循环的工作方式是在循环开始时计算循环开始和结束的数字,这意味着 num 只读过一次。

ws51t4hk

ws51t4hk4#

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

iq0todco

iq0todco5#

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

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

qc6wkl3g6#

您没有将先前的乘法存储在另一个变量中,并且 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);    
 }  
}

希望有帮助。

相关问题