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

C++基于栈实现质因数分解程序运行异常问题求助

问题排查及修复方案

核心错误点

  • 栈参数值传递问题:当前primeFactors函数的栈参数是值传递,函数内所有push操作仅修改栈的临时副本,main函数中定义的primeValues全程为空,这是你弹出值全为0/无效值的核心原因。需要将参数改为引用传递,函数声明和定义修改为void primeFactors(stack& primeValues, int entry)即可。
  • 栈弹出逻辑错误:
    1. 你从未向栈中压入0,用pop() != 0作为终止判断条件本身不成立,应该调用栈自带的empty()方法判断是否还有元素未弹出
    2. 循环中你每次执行两次pop()操作(一次在while条件判断,一次在cout输出),会直接丢失一半的质因数,还会触发空栈弹出的未定义行为
  • 边界处理缺陷:输入值为1时,仅直接输出1但未压入栈,会导致最终输出格式混乱
  • 质因数遍历小缺陷:for循环条件i <= sqrt(entry)每次都重复计算sqrt效率较低,且当entry在循环中被修改时判断可能失效,建议改为i*i <= entry

修复后的完整代码

#include <iostream>
#include <cmath>
using namespace std;

class stack
{
    public:
        static const int MAX = 100;
        stack() { used = 0; } // 构造函数

        void push(int entry);
        int pop();
        int size() { return used; }
        bool empty() { return used == 0;}

    private:
        int data[MAX];
        int used; // 栈中已使用的元素数量,栈顶元素下标为used - 1
};

void stack::push(int entry)
{
    if(used >= MAX) return; // 简单加个栈满判断避免溢出
    data[used] = entry;
    ++used;
}

int stack::pop()
{
    if(empty()) return 0; // 空栈弹出返回0避免未定义行为
    --used;
    return data[used];
}

void primeFactors(stack&, int); // 声明改为引用

int main()
{
    stack primeValues;
    int entry = 0;

    cout << "Enter a positive integer (0 to stop): ";
    cin >> entry;

    if (entry == 0)
    {
        return 0;
    }
    cout << "Prime factors: " << entry << " = ";
    primeFactors(primeValues, entry);

    // 修复弹出逻辑
    while(!primeValues.empty())
    {
        cout << primeValues.pop() << " ";
    }

    return 0;
}

void primeFactors(stack& primeValues, int entry) // 定义改为引用
{
    if (entry == 1)
    {
        primeValues.push(1); // 1压入栈统一处理
        return;
    }

    while (entry % 2 == 0)
    {
        primeValues.push(2);
        entry = entry/2;
    }

    for (int i = 3; i*i <= entry; i = i+2)
    {
        while (entry % i == 0)
        {
            primeValues.push(i);
            entry = entry/i;
        }
    }

    if (entry > 2)
    {
        primeValues.push(entry);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:09:03