恼人的素数

作者: 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;
}
posted @ 2017-09-16 22:59  Assassin_poi君  阅读(125)  评论(0编辑  收藏  举报