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

为什么这段C++代码无法正确输出num的质因数?

C++质因数分解程序异常排查

代码存在的3个核心问题

  • 致命运行错误:isPrime函数中循环变量初始值设为0,执行n0%i时触发除零异常,程序直接终止,根本走不到质因数打印的逻辑。同时这个循环的初始值逻辑本身就写错了,判断素数的试除应该从最小素数2开始,从0或者1开始试除都不符合逻辑。
  • 逻辑边界漏洞:prime_Factors的循环终止条件写为i < n1,如果输入的数字本身是素数,循环永远不会遍历到数字本身,导致素数输入场景下没有任何输出。
  • 潜在溢出风险:质因数判断逻辑里用x *= i逐次放大i来判断幂次整除,当输入数字较大时x会超出int类型的取值范围,触发整数溢出导致判断结果错误。

修正后的可运行代码

#include<bits/stdc++.h>
using namespace std;

void prime_Factors(int);
bool isPrime(int);

int main()
{
    int num;
    cout << "Enter the number to find it's prime factors: ";
    cin >> num;
    if (num < 2) {
        cout << "Please enter a number greater than or equal to 2." << endl;
        return 0;
    }
    prime_Factors(num);
    return 0;
}

void prime_Factors(int n1)
{
    // 修正循环边界到i <= n1,覆盖输入本身为素数的场景
    for(int i = 2; i <= n1; i++)
    {
        if(isPrime(i))
        {
            // 每次整除后直接将原数除以i,避免x自乘带来的溢出问题
            while(n1 % i == 0)
            {
                cout << i << " ";
                n1 /= i; 
            } 
        }
    }
}

bool isPrime(int n0)
{
    if(n0 <= 1)
        return false;
    // 修正循环初始值为2,从最小素数开始试除,避免除零错误
    for(int i = 2; i*i <= n0; i++)
    {
         if(n0%i == 0)
            return false;
    }
    return true;
}

测试验证

输入12,输出:2 2 3
输入7(素数),输出:7
输入90,输出:2 3 3 5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:09:21