我创建了一个素数检查程序,用于检查用户输入的数字是否为素数。
它可以轻松检测非素数,但是当我们输入素数时,它会崩溃!
我想我知道为什么,但不知道如何纠正它们......
这是我的计划:
#include "stdafx.h"
#include <iostream>
#include<iomanip>
#include <cmath>
using namespace std;
float Asker()
{
float n;
cin >> n;
return n;
}
int Remainder(int n, int x)
{
int q = n%x;
if (q == 0)
return 1;
else
Remainder(n, x + 1 > n);
/*
Here is the PROBLEM
*/
return 0;
}
int main()
{
cout << "Enter your Number : ";
float n = Asker();
int r = Remainder(n, 2);
if (r == 1)
cout << "That Ain't Prime!\n";
else
cout << "Yep Thats Prime!\n";
main();
return 0;
}
假设,当我输入7时,我知道,它检查到6,然后它应该崩溃!(由于x + 1&gt; n条件)。当其他条件失败时,我不知道如何返回0 ......
答案 0 :(得分:1)
回答你的问题“我的Prime号码检查器有什么问题?”很多事情都是错的:
main()
。这不是你递归的方式int Remainder(int n, int x)
你用float
(丢失演员表)然后使用bool
:Remainder(n, x + 1 > n);
asker
不需要是浮动关于main
内的递归,有两个原因:
ISO C ++禁止获取函数':: main'
的地址
答案 1 :(得分:1)
//#include "stdafx.h" //This is an invalid header.
#include <iostream>
#include<iomanip>
#include <cmath>
using namespace std;
float Asker()
{
float n;
cin >> n;
return n;
}
int Remainder(int n, int x)
{
int q = n%x;
if (q == 0 && n>2 )//'2' have to be excluded.
//otherwise 2%2==0 can set
//'2' as a non prime which is wrong
return 1;
else if(x+1<n)
Remainder(n, x + 1);
/*
Here was the PROBLEM
Remainder(n, x + 1 > n) 'x + 1 > n ' is an invalid paramrter.
*/
else
return 0;
}
int main()
{
cout << "Enter your Number : ";
float n=Asker();
int r=1; //It is essential to initialize r to 1
if(n!=1) //Have to exclude '1'. Otherwise
//It will assign '1' as prime which is wrong
r = Remainder(n, 2);
if (r == 1 )
cout << "That Ain't Prime!\n";
else
cout << "Yep Thats Prime!\n";
//main(); //Why are you calling main again?
return 0;
}
但是你应该知道检查质数的最短方法是检查n%x == 0直到x&lt; = square_root(n)。
答案 2 :(得分:-1)
首先,您不必检查所有数字的模数为n-1
:只需检查模数为sqrt(n)
即可。其次,如果要检查的下一个除数大于sqrt(n)
,则应该从函数返回0。以下是更正后的Remainder
函数。
int Remainder(int n, int x)
{
int q = n%x;
if (q == 0)
return 1;
else
{
if(x+1 > std::sqrt(n)) return 0;
else return Remainder(n, x + 1);
}
}
最后,最好将n
中的main
和Asker
中的float
更改为int
,并返回{{1}的类型}}也应该是Asker
。
这不是一个令人筋疲力尽的清单,列出了关注素数检查器的问题 - 只是一种快速解决问题的方法。从本质上讲,这样的素数检查器不应该使用递归 - 只需迭代从2到int
的所有潜在除数就可以了。