恼人的素数
作者: ijrys
单位: 青岛大学
时间限制: 1000ms
内存限制: 64MB
代码长度限制: 16KB
连羽疲倦的推开公主阁的门,“啊啊啊,怎么会留这么麻烦的作业。”
“既然布置了,那就没有办法了啊,今晚一起算就好了。”连辰拍了拍连羽的背,表示鼓励。
荆盈将做好的菜端到餐桌上,看着勉强露出笑容的两人问道:“所以你们老师布置了什么题啊?”
“关于素数的题,老师给了一个很大的数,问是不是素数。”连辰解释道。
“素数啊,我到是知道些比较快的判断方法。”
“真的?”连羽如同见了救星一般。
作为立志要成为计算机天才的你们,能帮助连羽么?
输入格式:
多组测试
每组测试有一行,为一个正整数k(k < 10^9),
输出格式:
每组测试输出一行,
若k为素数,输出“Yes”,否则输出“No”
输入样例:
2
7
15
21
23
233
2333
23333
233333
2333333
输出样例:
在这里给出相应的输出。例如:
Yes
Yes
No
No
Yes
Yes
Yes
Yes
No
No
思路:
1E9开根后是31622.7766017≈32000。
也就是说用正常的素数判断方法最大需要判断到32000,
那只要能减少判断的数量自然就能加快。
很容易发现如果一个数N,N%2!=0,那N%4、N%6、N%8都不可能为零。所以只需要判断N%2就行了,即判断2——sqrt(N)中的素数即可。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
bool board[32005];
int prime[5000];//存储2-32000中的所有素数。
int flag;
void Build(){
board[1] = true;
for(int i = 2 ; i<32000 ; i++){
if(board[i] == false){
for(int j=i*2 ; j<32000 ; j+=i)board[j] = true;
}
} //用筛选法找出素数
for(int i=2 ; i<32000 ; i++){
if(board[i] == false)prime[flag++] = i;
}
}
int isPrime(int N){
if(N<=1)return 0;
for(int i=0 ; prime[i]<=sqrt(N)&&i<flag ; i++){
if(N%prime[i] == 0)return 0;
}
return 1;
} //判断是否是素数
int main(){
int N;
Build();
while(scanf("%d",&N)!=EOF){
if(isPrime(N))printf("Yes\n");
else printf("No\n");
}
return 0;
}