【发布时间】:2019-12-17 15:15:34
【问题描述】:
我正在尝试编写一个程序来计算用户输入的数字的最大素因子,函数 “FindFactor” 计算存储在变量 中的最大因子"Factor" 和函数 "TestFactor" 测试该因子有多少个因子,然后将其存储在 "NFactors" 中,如果 "NFactors"等于0,Factor是质因数,如果不是,则将初始输入值替换为“Factor”,重新开始循环。
问题是任何给定数字的输出是输入的最大因子而不是素数因子。
经过一番修改,我确认问题出在 "TestFactor" 因为 "FindFactor" 能够正确计算最大因子,但我不知道为什么 "TestFactor" 总是输出 0,因为这两个函数实际上是相同的。
当我尝试使用调试器时,事情变得更加奇怪,(但这可能是因为这是我第一次使用它并且我不知道我在做什么):
我在 "NF"(包含在 "TestFactor" 中的一个局部变量)设置了一个断点,以查看它的值,然后我收到一条消息告诉我 "标识符“i”未定义”,“i”是一个包含在“FindFactor”函数中的局部变量,该函数实际上可以正常工作。
然后我将断点设置为 "NFactors",这次我得到以下异常:"Largest Prime Factor.exe 中 0x00A01D9D 处的未处理异常:0xC0000094:整数除以零。 "
参考如下操作:
如果 (y % j == 0)
这绝对不是这样,因为 j=y-1。
这是完整的程序:
#include <iostream>
using namespace std;
int FindFactor(int x);
int TestFactor(int y);
int main() {
int input, Factor, NFactors,inputsave; bool prime=false;
cout << "Please enter a number" << endl;
cin >> input;
inputsave = input;
while (prime == false) {
Factor = FindFactor(input);
NFactors = TestFactor(Factor);
if (NFactors != 0) {
prime = true;
}
else {
prime = false;
input = Factor;
}
}
cout << "The largest prime factor for " << inputsave << " is " << Factor << endl;
}
int FindFactor(int x) {
int i;
for (i = x - 1; i > 1; i--) {
if (x % i == 0) {
break;
}
else {};
}
return i;
}
int TestFactor(int y) {
int j, NF = 0;
for (j = y - 1; j > 1; j--) {
if (y % j == 0) {
NF++;
}
else {};
}
return NF;
}
总结:
“TestFactor”:输出总是0。
主程序:输出永远是输入的最大因子,而不是素数因子。
【问题讨论】:
-
if (NFactors = !0)这是有意的还是您的意思是if (NFactors != 0)?因为第一个将1(!0)赋值给Nfactors -
编译器也是非常有用的调试工具。如果您在编译器上打开警告,它可能会告诉您“嘿,我认为这里有问题!”。例如,gcc told me the following:
warning: suggest parentheses around assignment used as truth value。其实我没看懂是什么意思,但是把注意力转移到了有问题的那一行。 -
@MikevanDyke 我修正了那个错字,但程序现在只是崩溃了。
标签: c++ visual-studio debugging breakpoints