对于大于 11 的数,如果除了 11 和它本身,它不能再被其它正整数整除,那么我们说它是一个质数。晓萌想判断一个数是不是质数,希望找你写个程序,帮助她进行判断。
输入格式
输入包括一行,为一个整数 N
输出格式
输出包括一行,如果晓萌给出的整数 NN 为质数,那么输出YES;如果 NN 不是质数,那么输出NO。
样例输入
3
样例输出
YES
1)最容易想到的,也是我一开始想到的方法便是让被测数依次除以2~N-1的数,如果存在一个能整除的,则为非质数,否则为质数。
#include <iostream>
using namespace std;
int main()
{
int N=0;
cin>>N;
if(1<N<=1000)
{
for(int i=2;i<=N-1;i++)
{
if(N%i==0)
{
cout<<"NO"<<endl;
return 0;}
}
cout<<"YES";
}
else
{
cout<<"please input from 1 to 1000"<<endl;
}
return 0;
}
2)上述判断方法,明显存在效率极低的问题。对于每个数n,其实并不需要从3判断到n-1,这里用到一个判别质数的算法,一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,上述代码中并不需要遍历到n-1,遍历到sqrt(n)即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数
#include <iostream>
#include <cmath>
using namespace std;
bool IsPrime(int Num)
{
int tempt=(int)sqrt((float)Num);
for(int i=2;i<=tempt;i++)
{
if(Num%i==0) return 0;
}
return 1;
}
int main()
{
int N=0;
cin>>N;
if(IsPrime(N)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}
其中要注意的是sqrt的运用,该函数是在cmath库里面,因此要在预编译之前包含该库。另外sqrt的形参是float和double型,因此要将Num强制转换为float型,此外还要将开方的结果强制转换为int型(因为等号左边的tempt是int型)
int tempt=(int)sqrt((float)Num);
3)还有一种方法是在以下博文中看到的,没有具体理解什么意思,有兴趣的朋友可以自己看一下。
http://blog.youkuaiyun.com/huang_miao_xin/article/details/51331710