You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算大数字阶乘的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:45:41