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

vector<amicable>触发Segmentation Fault问题排查及解决方案求助

分割错误(Segmentation Fault)原因分析与解决方案

错误原因

你的代码触发Segmentation Fault的核心问题是数组越界访问:
在构建amicable向量的循环中,int j = sumar[i]; int c = sumar[j];这两行未做边界检查。当i的真因数和j超过sumar的最大索引(100000)时,访问sumar[j]会直接访问非法内存区域,导致程序崩溃。

你将循环上限降到45000时能运行,是因为该范围内所有数的真因数和都未超过100000,不会触发越界;但当范围扩大到100000时,部分大数的真因数和会超出这个范围,进而触发内存访问错误。

解决方案

需要在访问sumar[j]前添加边界检查,同时避免重复记录亲和数对,最后对amicable向量排序以保证后续求和逻辑正确:

修改后的核心代码片段

vector<int> amicable;
for(int i=1;i<=100000;i++){
    int j = sumar[i];
    // 过滤超出sumar范围的j,避免越界访问
    if(j < 0 || j > 100000) {
        continue;
    }
    int c = sumar[j];
    if(i == c && i != j){
        // 只在i<j时添加,避免重复记录同一亲和数对
        if(i < j){
            amicable.push_back(i);
            amicable.push_back(j);
        }
    }
}
// 排序amicable,保证后续遍历到大于n的数时能正确break
sort(amicable.begin(), amicable.end());

完整修改说明

  1. 边界检查:增加j < 0 || j > 100000的判断,跳过所有因数和超出sumar范围的数,彻底避免越界访问。
  2. 去重处理:通过i < j的判断,每个亲和数对仅记录一次,避免后续求和时重复计算。
  3. 排序向量:对amicable排序后,后续遍历到大于n的元素时可以直接break,保证求和逻辑的正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:36:14