为什么CodeChef不接受我递归实现的阶乘题解,循环实现却可以?
你找到的int类型溢出问题确实是提交失败的核心原因,和递归实现本身没有直接关联,这里补充几个关键细节:
- 常规32位int类型的最大值为2^31-1(约21亿),而13的阶乘就已经达到6227020800,远超过int的存储上限,n=1000的阶乘更是有数千位,完全不可能用基础整数类型存储。你本地测试能正常运行,大概率是本地用的测试用例n取值都小于13,没有触发溢出场景。
- 你写的for循环版本能通过,应该是实现循环时你换成了更大范围的数值类型,或是额外实现了大整数运算逻辑,和递归、循环的性能差异无关。1000层的递归深度对于绝大多数竞技编程的判题环境来说完全在栈承受范围内,不会触发栈溢出报错。
如果题目要求输出完整的1000阶乘结果,你需要手动实现大整数乘法逻辑,通用的实现思路如下:
- 用数组存储阶乘的每一位数字,初始化数组第一位为1
- 从2开始遍历到n,每轮用当前遍历值和数组里的每一位做乘法,同时处理进位
- 遍历结束后倒序输出数组内容,就能得到完整的大整数阶乘结果
你原有的递归代码逻辑本身没有问题,只是数据类型选择不符合题目要求:
int factorial(int n) { if(n>1) { return n*factorial(n-1); } else { return 1; } } int main() { int t; cin>>t; while(t--) { int n; cin>>n; cout<< factorial(n); } return 0; }
内容的提问来源于stack exchange,提问作者Akshat kant
相关产品推荐
相关产品推荐

