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

算法执行异常终止排查及指定奇除数筛选代码修复请求

算法异常终止排查与代码修复

问题描述

需要实现的功能:在数值区间[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:40:45