调试主要程序
Debug Prime Program
我正在研究这个程序,它确定一个数字是否是素数。 编译时没有收到任何错误,但输出不正确。 谁能告诉我出了什么问题(以及如何解决它?
#define PROMPT "Please enter a whole number: "
#define NOT_PRIME "The number is not a prime number! "
#define PRIME "The number is a prime number "
#define DONE 0
#define FIRST_FACTOR 3
using std::cout;
using std::cin;
int main(){
int i;
char number;
cout << PROMPT;
cin >> number;
for (i=FIRST_FACTOR; i<=number; i++){
prime = true;
for (int n=2; n<=i-1; n++){
if (i%n == 0){
prime = false;
}
}
if(prime){
cout << number << PRIME << endl;
}
else{
cout << number << NOT_PRIME << endl;
}
}
return 0;
}
最大的问题是你的程序总是在应该打印i
的时候打印number
。
if(prime){
cout << i << PRIME << endl;
}
else{
cout << i << NOT_PRIME << endl;
}
另一个问题是您将number
声明为 char
而不是 int
.
除此之外,您的程序正在运行(链接到 ideone),但次优。
要使其达到最佳状态,请考虑以下更改(按挑战增加的顺序):
- 不要测试偶数是否为素数:在循环结束时打印另一条消息,说明
i+1
不是素数,并将i
增加 2。 - 当您达到候选项的平方根时停止:换句话说,不是在
for
循环中n<=i-1
写n*n <= i
- 存储到目前为止找到的素数列表;与其测试从
2
到sqrt(i)
的所有可能因子,不如只测试已经找到的素数。 - 考虑切换到更高级的算法来查找素数。
您的问题是:
- 数字应为 int 或无符号 int。
- 第二个 for 循环毫无意义。
- 您的控制流程要复杂,使其更简单。
以下是我认为解决方案应该的样子:
#include <iostream>
int main() {
std::cout << "Please enter a whole number: " << std::endl;
unsigned int number;
std::cin >> number;
for (unsigned int i = 2; i * i < number; i++) {
if(number%i == 0) {
std::cout << "The number is not a prime number! " << std::endl;
return 0;
}
}
std::cout << "The number is a prime number " << std::endl;
return 0;
}
我不确定为什么你在代码中循环两次,你可以把它改成类似的东西
if (number % 2 == 0) prime = false;
for (i = 3; i <= sqrt(number) && prime; i+=2)
if (number % i == 0) prime = false;
意识到一个数字的最高除数(可以均匀地除以它)等于它的平方根,所以你不需要检查超过这个数字。
我假设你应该循环两次,以便继续请求新条目,直到它们输入 0。
#define PROMPT "Please enter a whole number: "
#define NOT_PRIME " is not a prime number! "
#define PRIME " is a prime number "
using std::cout;
using std::cin;
int main(){
int number;
bool prime;
while (true)
{
prime = false;
cout << PROMPT;
cin >> number;
if (number == 0) break;
int MaxPossibleFactor = (int)(sqrt(number) + 1);
if ((number % 2) == 0)
{
prime = true;
}
else
{
for (int i=3; i<=MaxPossibleFactor; i += 2)
{
if ((number % i) == 0)
{
prime = true;
break;
}
}
}
if (prime)
{
cout << number << PRIME << endl;
}
else
{
cout << number << NOT_PRIME << endl;
}
}
return 0;
}
相关文章:
- 使用调试/崩溃报告将应用程序部署到客户端
- WinDeployqt 不会为调试应用程序部署 Qwindowsd.dll
- 如何在添加文件的情况下在VSCode中调试C++程序
- 调试 ASP MVC 应用程序中使用的C++ DLL
- 调试控制台 ChessEngine.exe "used"在另一个应用程序(国际象棋 GUI)中
- 在 c++ 中,rand() 在执行有调试和不带调试的程序时生成不同的结果
- 如何在 VsCode 上调试 C++/C 程序
- 为什么我的程序无法在GDB在线编译器/调试器或Visual Studio C++ 2019中运行
- 在集成终端上运行vscode lldb调试器时,如何获取程序的输出?
- 如何将Valgrind与Qt Creator一起使用来调试远程应用程序?
- 程序在 CLion 中调试时收到分段错误
- 如何调试无法编译的Arduino程序?
- 如何使用VB经典IDE在VB脚本中调试ActiveX应用程序
- 程序调试
- 使用应用程序验证程序调试时应用程序挂起
- Anagram程序调试
- C++程序调试
- Visual Studio控制台应用程序调试
- GDB/DDD:使用多进程应用程序 C/C++调试共享库
- 试图使一个.dll插件,但通过程序调试给出了错误