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

为何自定义函数首次迭代后无法正常工作?C++代码问题排查

问题分析与修复

核心问题

你的代码中primos函数的变量x未初始化,导致第一次调用后残留脏值,后续素数判断逻辑完全失效:

  • 第一次调用primos(5)时,未初始化的x恰好累加1+5后等于6(5+1),返回true,此时x的值被保留为6。
  • 第二次调用divs(15)时,会检查到i=3满足15%3==0,接着调用primos(3)。此时x还是之前的6,累加1+3后变成10,10不等于3+1,返回false,导致divs(15)找不到符合条件的质因数,最终返回0,所以控制台输出50而非预期的53。

修复后的完整代码

#include <iostream>
#include <stdlib.h>

using namespace std;

bool primos(int primo);
int divs(int num);

int dato, d2;

int main()
{   
    cout << divs(5);
    cout << divs(15);
    return 0;
}

// 判断素数
bool primos(int primo)
{
    int x = 0; // 关键:初始化x为0
    for (int i = 1; i <= primo; i++)
    {
        if (primo % i == 0)
        {
            x += i;
        }
    }
    return x == (primo + 1);
}

// 获取最小质因数
int divs(int num)
{
    for (int i = 2; i <= num; i++)
    {
        if (num % i == 0 && primos(i))
        {
            return i;
        }
    }
    return 0;
}

额外优化建议(可选)

素数判断的效率可以进一步提升:

  • 循环只需遍历到sqrt(primo),因为如果primo有大于其平方根的因数,必然对应一个小于平方根的因数。
  • 可以直接统计因数的个数,而非累加和,逻辑更直观:
bool primos(int primo)
{
    if (primo <= 1) return false;
    int count = 0;
    for (int i = 1; i * i <= primo; i++)
    {
        if (primo % i == 0)
        {
            count++;
            if (i != primo / i) count++;
        }
    }
    return count == 2;
}

验证结果

修复后运行代码,控制台会输出53,与预期一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:24:17