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

求解vector编程题时C++代码触发Caught Fatal Signal 11错误如何解决?

错误原因分析

Signal 11为段错误,代表程序访问了非法内存地址,你的代码存在两个核心问题:

  • 固定长度数组越界:你预先定义了长度为1000000的全局数组v和s,如果评测用例的输入n大于1000000,循环写入数组元素时会访问边界外的内存,直接触发段错误。
  • 整数溢出风险:32位int类型最大值约为21亿,当输入的x大于1200时,x*(x+1)*(x+2)的乘积就会超出int的取值范围,溢出会导致计算结果错误,极端情况下也可能触发内存访问异常。

你的求和公式推导是正确的,该公式是前x个三角数的求和结果,即等于x*(x+1)*(x+2)/6。

修复方案

按照题目要求需要将结果存储到独立vector中,修复后的代码如下:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    // 加速输入输出,避免大数据量场景超时
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n;
    cin >> n;
    // 动态创建对应长度的vector存储结果,避免固定数组越界
    vector<long long> res(n);
    
    for (int i = 0; i < n; ++i) {
        long long x;
        cin >> x;
        // 用long long类型计算,避免整数溢出
        res[i] = x * (x + 1) * (x + 2) / 6;
    }
    
    // 输出结果
    for (long long num : res) {
        cout << num << " ";
    }
    return 0;
}

如果不需要提前存储所有结果,也可以读一个算一个输出一个,进一步节省内存:

#include <iostream>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        long long x;
        cin >> x;
        cout << x * (x + 1) * (x + 2) / 6 << " ";
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Cyrex231

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:48:02