C++基于栈实现质因数分解程序运行异常问题求助
问题排查及修复方案
核心错误点
- 栈参数值传递问题:当前
primeFactors函数的栈参数是值传递,函数内所有push操作仅修改栈的临时副本,main函数中定义的primeValues全程为空,这是你弹出值全为0/无效值的核心原因。需要将参数改为引用传递,函数声明和定义修改为void primeFactors(stack& primeValues, int entry)即可。 - 栈弹出逻辑错误:
- 你从未向栈中压入0,用
pop() != 0作为终止判断条件本身不成立,应该调用栈自带的empty()方法判断是否还有元素未弹出 - 循环中你每次执行两次
pop()操作(一次在while条件判断,一次在cout输出),会直接丢失一半的质因数,还会触发空栈弹出的未定义行为
- 你从未向栈中压入0,用
- 边界处理缺陷:输入值为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
相关产品推荐
相关产品推荐

