描述
素数也称质数,是指在大于1的正整数中,除了1和它本身以外不再有其他因数的自然数,如2、3、7、11、13、19、37都是素数,最小的素数是2。
编写程序,输入一个正整数n,判断n是否为素数,如果是,则输出“Yes”,否则输出“No”。
输入描述
输入一个正整数n。
输出描述
如果n是素数,则输出“Yes”,否则输出“No”。
这里虽然说是判断素数,但其实就是判断是不是合数,除了0、1和负数的数,不是质数就是合数。举个例子,在2~10中挑出素数,只要把4、6、8、10排除就行了。
那么首先,我们定义一个n,那么素数的定义就是因数只有2个的数叫做素数,在之前“找n~m素数”这篇文章中有提到过。那么我们先写一个for循环:
int q = 0;
for(int i = 2;i <= n;i ++){
if(n % i == 0) q ++;
}
最后还要判断q的值:
if(q == 2) cout << "Yes";
else cout << "No";
代码如下:
#include <iostream>
using namespace std;
int main(){
int n,a=1,q=0;
cin >> n;
while(n){
if(n % a == 0){
q += 1;
}
if(a == n){
break;
}
a ++;
}
if(q != 2){
cout << "No";
}
else{
cout << "Yes";
}
return 0;
}
但是编译时间太长了,这就要0.97秒了,时间太长就麻烦了,这时我们就要判断了。
我们先把1~100的素数列出来,判断规律:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 57 59 61 67 71 73 79 83 87
我们可以发现一个规律就是除了0、1外的所有正整数,只有2是素数,那么我们可以先进行一个判断:
if(n != 2 && n % 2 == 0) cout << "No";
这样就可以先让除2外的偶数在开始时就进行了结束的判断。然后剩下的奇数也没什么规律,我们就再举几个例子:
37 : 1,37;
39 : 1,3,13,39;
45 : 1,5,9,45;
25 :1,5,25;
我们可以发现,每一个除了1与n的因数,都会在1 ~ 根号n中出现,这样可以将次数“对半砍”。这是需要用到cmath库里的sqrt()了。
代码如下:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int n,q = 0;
cin >> n;
if(n != 2 && n % 2 == 0) cout << "No";
for(int i = 1;i <= sqrt(n);i ++) {
if(n % i == 0) q ++;
}
if(q == 1) cout << "Yes";
else cout << "No";
return 0;
}