求解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
相关产品推荐
相关产品推荐

