我正在Saylor学院的网页上通过计算机科学学习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);
}
}
答案 0 :(得分:6)
20!是2,432,902,008,176,640,000(~2 * 10 ^ 18),远远大于可以存储在int
中的最大可能数,大约是20亿。此代码将溢出并显示错误的答案。
要做出的更正是将factorial
的声明从int
更改为long
。
答案 1 :(得分:2)
20!
的值远远大于int
类型可以存储的值。
答案 2 :(得分:0)
使用long
代替int
可能没有任何语法错误。但是有一些错误是编译器所不知道的。因此,它将此问题移交给OS,OS立即终止程序。通常就是这种情况。通过引入有效的 EXCEPTION HANDLING 来克服这类问题,即逻辑错误,Java变得更加强大。
答案 3 :(得分:0)
正如其他人所指出的,在这种情况下,数据类型是你的限制。
如果您希望计算大数学,您应该使用特别适合代表大数字的自定义数据类型。
如果您想了解这样的实现,我强烈建议您阅读PaŭloEbermann对this StackOverflow question的非常彻底的回答。
如果您对实现的工作方式不感兴趣,但想要执行大整数计算,则可以使用Java的BigInteger数据类型。