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());
完整修改说明
- 边界检查:增加
j < 0 || j > 100000的判断,跳过所有因数和超出sumar范围的数,彻底避免越界访问。 - 去重处理:通过
i < j的判断,每个亲和数对仅记录一次,避免后续求和时重复计算。 - 排序向量:对
amicable排序后,后续遍历到大于n的元素时可以直接break,保证求和逻辑的正确性。
内容的提问来源于stack exchange,提问作者Akhil Thandu
相关产品推荐
相关产品推荐

