Java 阶乘计算

Java 阶乘计算,java,Java,我在塞勒学院的网页上学习计算机科学,学习java编程。我学到了在NetBeans中调试程序的知识,有一个程序可以计算并打印n(=1*2*3*…*n)。文本说程序中有逻辑错误,但没有说明它在哪里。我似乎不知道逻辑错误在哪里 有人能帮忙吗?程序代码: /** Compute the factorial of n */ public class Factorial { // Print factorial of n public static void main(String[] args

我在塞勒学院的网页上学习计算机科学,学习java编程。我学到了在NetBeans中调试程序的知识,有一个程序可以计算并打印
n(=1*2*3*…*n)
。文本说程序中有逻辑错误,但没有说明它在哪里。我似乎不知道逻辑错误在哪里

有人能帮忙吗?程序代码:

/** Compute the factorial of n */
public class Factorial {
   // Print factorial of n
   public static void main(String[] args) {
      int n = 20;
      int factorial = 1;

      // n! = 1*2*3...*n
      for (int i = 1; i <= n; i++) {
         factorial *= i;
      }
      System.out.println("The Factorial of " + n + " is " + factorial);
   }
}
/**计算n的阶乘*/
公共类阶乘{
//n的印刷阶乘
公共静态void main(字符串[]args){
int n=20;
整数阶乘=1;
//n!=1*2*3…*n

对于(int i=1;i而言,
20!
的值远大于
int
类型可以存储的值。

20!是2432902008176640000(~2*10^18),远大于
int
中可以存储的最大可能数字,大约为20亿。此代码将溢出并显示错误答案


要进行的更正是将
factorial
的声明从
int
更改为
long
使用
long
而不是
int


可能没有任何语法错误。但是有一些编译器不知道的错误。因此,它将此问题移交给操作系统,操作系统立即终止程序。C通常就是这种情况。通过引入有效的异常处理来克服这类问题(即逻辑错误),Java变得更加强大rs.

正如其他人所指出的,在这种情况下,数据类型是您的限制

如果您希望计算大型数学,则应使用专门适合表示大型数字的自定义数据类型

如果您希望了解这样一个实现,我强烈建议您阅读Paŭlo Ebermann令人难以置信的详尽答案


如果您对实现的工作方式不感兴趣,但希望执行大整数计算,则可以使用Java的数据类型。

您是否尝试过运行它?该程序可以正常运行,但对
n=20
无效,因为
int
将溢出。是的,我尝试过运行它/调试它。您的问题被否决了有几个原因。一个原因是,这是一个公开的家庭作业问题,这很好,但写的方式不会让其他人在将来从问题的主要方面学习。另一个原因是,你已经发布了所有的代码,但不是它给你的错误或意外行为,或者为什么你很难找到问题。谢谢s:)我试着一步一步地调试,当我达到I=17时,这个数字就变成了负数。应该想到变量类型,但只是在循环中被锁定:)实际上,12!是
int
中适合的最大阶乘。13!(6227020800)将溢出,但产生的错误数字仍然是正数(
1932053504
)。