计算大数字阶乘的C++代码为何出现Segmentation Fault?
问题排查与修复
你的代码出现Segmentation Fault主要有两个核心问题:
1. 越界访问vector内存
当内层循环结束后,j的值等于fact.size(),此时你直接执行fact[j] = carry——vector的合法下标范围是0到fact.size()-1,访问fact[j]属于越界操作,会直接触发内存访问错误,导致段错误。
正确做法是用push_back将carry添加到vector末尾:
if(carry!=0){ fact.push_back(carry); }
2. 函数缺少返回语句
你的函数声明明确要求返回vector<int>,但函数末尾没有任何return语句。这会触发未定义行为,程序会读取随机内存地址的数据,大概率引发段错误或其他异常。
需要在reverse操作后添加返回语句:
reverse(fact.begin(), fact.end()); return fact;
额外优化(避免结果错误)
当计算较大的N时,carry可能是多位数(比如123),直接存入整个数值会导致结果错误,需要拆分每一位存入vector:
if(carry!=0){ while(carry > 0){ fact.push_back(carry%10); carry = carry/10; } }
修复后的完整代码
#include <vector> #include <algorithm> class Solution { public: vector<int> factorial(int N){ vector<int> fact; fact.push_back(1); for(int i=2; i<=N; i++){ int carry=0; int j; for(j=0; j<fact.size(); j++){ int val = fact[j]*i + carry; fact[j] = val%10; carry = val/10; } if(carry!=0){ while(carry > 0){ fact.push_back(carry%10); carry = carry/10; } } } reverse(fact.begin(), fact.end()); return fact; } };
内容的提问来源于stack exchange,提问作者lgv
相关产品推荐
相关产品推荐

