Java 19中int类型可计算的最大阶乘及long类型实现咨询
Java中int和long类型的阶乘计算问题
一、int类型能计算的最大正确阶乘
是的,int类型能正确计算的最大阶乘是12!。
Java里int是32位有符号整数,取值范围是-2147483648到2147483647。实际计算验证:
- 12! = 479001600,这个数在int的范围内,结果完全正确;
- 13! = 6227020800,已经远超int的最大值,会触发整数溢出,得到错误的结果(通常是负数或无意义的正数)。
你的递归代码逻辑没问题,运行后确实会在n≥13时输出"Trop grand"并返回-1,12及以下的输入都能得到正确的阶乘结果,和你观察到的一致。
二、用long类型实现阶乘函数
Java的long是64位有符号整数,取值范围比int大得多,能支持计算到20!(20! = 2432902008176640000),21!及以上的结果会超出long的最大值,同样会溢出。
递归实现代码
public static long factorial(long n) { // 处理负数输入 if (n < 0) { System.out.println("负数没有阶乘"); return -1; } // 限制最大输入,避免long溢出 if (n > 20) { System.out.println("数值过大,long类型无法存储正确结果"); return -1; } // 阶乘终止条件:0! = 1 if (n == 0) { return 1; } else { return n * factorial(n - 1); } }
非递归(循环)实现代码
如果担心递归深度问题(虽然阶乘到20完全不存在这个问题),也可以用循环实现:
public static long factorialLoop(long n) { if (n < 0) { System.out.println("负数没有阶乘"); return -1; } if (n > 20) { System.out.println("数值过大,long类型无法存储正确结果"); return -1; } long result = 1; for (long i = 1; i <= n; i++) { result *= i; } return result; }
你之前失败的可能原因
如果之前尝试没得到预期结果,大概率是这几个问题:
- 没有限制n的最大值(超过20还继续计算,导致long溢出,结果错误);
- 没处理负数输入的情况;
- 递归的终止条件写错(比如漏了0!返回1的逻辑)。
内容的提问来源于stack exchange,提问作者Big Moustache guy
相关产品推荐
相关产品推荐

