算法执行异常终止排查及指定奇除数筛选代码修复请求
算法异常终止排查与代码修复
问题描述
需要实现的功能:在数值区间[A;B](1<A<B<1000000)内,筛选出除1和自身(若自身为奇数)外恰好拥有3个不同自然奇除数的数字,并按每行一个的格式输出该数字及其3个奇除数(示例:30 3 5 15 、42 3 7 21 等)。
原代码执行时出现异常终止,代码如下:
#include <iostream> using namespace std; int main() { int A,B,g,j,i,c,chislo1,chislo2,chislo3,counter1; A=30; B=68; counter1=0; chislo1=0; chislo2=0; chislo3=0; if (1<A && B<1000000) { for (A;A!=B;A++) { for (i=2;i!=A+1;i++) { if (A%i==0 && i&2!=0) { counter1+=1; } } if (counter1==3) { for (i=2;i!=A+1;i++) { if (A%i==0 && i%2!=0) { chislo1=i; break; } } for (i=chislo1+1;i!=A+1;i++) { if (A%i==0 && i%2!=0) { chislo2=i; break; } } for (i=chislo2+1;i!=A+1;i++) { if (A%i==0 && i%2!=0) { chislo3=i; cout<<A<<" "<<chislo1<<" "<<chislo2<<" "<<chislo3<<endl; counter1=0; counter1=0; chislo1=0; chislo2=0; chislo3=0; break; } } } } } else { cout<<"Неверный диапазон"; } return 0; }
异常终止原因分析
- 计数器未及时重置:
counter1仅在初始化和找到符合条件的数后重置,处理不符合条件的数时会持续累加,最终超出int类型的取值范围,触发整数溢出异常。 - 奇数判断逻辑错误:使用
i&2!=0判断奇数完全错误,i&2检测的是二进制第二位是否为1,正确的奇数判断应为i&1!=0或i%2!=0。 - 循环变量滥用:直接将输入参数
A作为循环变量修改,破坏了原始输入值,且循环条件A!=B在部分场景下可能导致逻辑异常。 - 除数查找逻辑存在风险:多次循环查找除数效率低下,若因计数错误导致
counter1==3但实际不存在3个奇除数时,后续循环会使用未正确赋值的变量(如chislo2为0),引发非法内存访问或逻辑混乱。
修复后的代码
#include <iostream> #include <vector> using namespace std; int main() { int A = 30; int B = 68; if (1 < A && B < 1000000) { // 遍历区间内的每个数字 for (int num = A; num < B; ++num) { vector<int> odd_divisors; // 收集除1和自身外的奇除数 for (int i = 2; i < num; ++i) { if (num % i == 0 && i % 2 != 0) { odd_divisors.push_back(i); } } // 检查是否恰好有3个奇除数 if (odd_divisors.size() == 3) { cout << num << " " << odd_divisors[0] << " " << odd_divisors[1] << " " << odd_divisors[2] << endl; } } } else { cout << "Неверный диапазон" << endl; } return 0; }
额外优化建议
- 性能优化:对于接近1e6的大数区间,当前遍历每个数的所有除数效率较低,可以改为遍历到
sqrt(num)来减少循环次数,同时通过除数对的方式收集结果,避免超时。 - 变量命名:使用更具语义的变量名(如
odd_divisors代替chislo1等),提升代码可读性。
内容的提问来源于stack exchange,提问作者Wismut
相关产品推荐
相关产品推荐

