HDU 2012 素数判断方式

复习了一下素数 埃氏筛 线性筛

埃氏筛和线性筛可以优先筛选出素数,从而节省时间哦

线性筛应该挺好理解的 

埃氏筛就是i%prime[j] 这里可能不太好理解 可以举几下例子 就会慢慢懂的

举了例子 下次再看  脑海里就会自动浮现当初举的例子啦。

// 基础判断素数

bool prime(long long p){
    for(int i=2; i * i < p; i++){
        if(p % i == 0)
            return true;
    }
    return false;
}
//  线性筛

void findprime(){
        for(int i = 2; i <= 1000 ; i++){
        if(!isnotprime[i]){  //首位素数为false
            prime[primeCount++] = i;
            for(int j = 2 * i; j <= 1000; j += i)
                isnotprime[j] = true;  //非素数标记true不再进入循环
        }
    }
}
//  埃氏筛

void findprime(){
    for(long i = 2; i < max; i++){
        if(!isnotprime[i])i
            prime[primeCount++] = i;
        for(long j = 0; j < primeCount && i * prime[j] < max; j++) //用i*prime[j]来表示素数的所有倍数,j从0开始,prime从首个素数开始计算,另外i*prime[j]不能大于max{
            isnotprime[i * prime[j]] = 1;
        if(!(i % prime[j]))  //只要首个倍数已经会被某个素数整除,那么比他还要大的相应的倍数自然也不是素数,直接break掉,不再计算比他要大的相应的倍数,时间减少
            break;
        }
    }
//http://acm.hdu.edu.cn/showproblem.php?pid=2012
#include <stdio.h>
#define max 2600

bool isNotPrime[max];
int primeCount = 0;
int prime[max];

void findPrime(){
    for(int i = 2; i < max; i ++){
        if(!isNotPrime[i]){
            prime[primeCount++] = i;
        }
        for(int j = 0; j < primeCount && i * prime[j] < max; j ++){
            isNotPrime[i * prime[j]] = true;
            if(!(i % prime[j]))
                break;
        }
    }
}

int main(){
    int x, y, z;
    findPrime();
    while(scanf("%d%d", &x, &y) != EOF){
        if(x == 0 && y == 0)    break;
        int i;
        for(i = x; i <= y; i ++){
            z = i * i + i + 41;
            if(!isNotPrime[z])  continue;
            else    break;
        }
        if(i == y + 1)  printf("OK\n");
        else    printf("Sorry\n");
    }
    return 0;
}

 

posted @ 2018-06-01 00:11  碧殇冰心  阅读(623)  评论(0编辑  收藏  举报