有關判斷素數

最近新學習了一個神奇的判斷素數的方法

已知:大於等於5的質數一定和6的倍數相鄰
證明:令x≥1,將大於等於5的自然數表示如下:······6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······ 可以看到,不在6的倍數兩側,即6x兩側的數爲6x+2,6x+3,6x+4,由於2(3x+1),3(2x+1),2(3x+2),所以它們一定不是素數,再除去6x本身,顯然,素數要出現只可能出現在6x的相鄰兩側。這裏要注意的一點是,在6的倍數相鄰兩側並不是一定就是質數。根據以上規律,判斷質數可以6個爲單元快進,即循環中i+=6,加快判斷速度
證畢

最後小於5的特殊處理,大於6的在循環中枚舉着判斷

跑賊快

當然如果測試組數實在太多可能還是歐拉篩或者杜教篩、埃拉托色尼篩要更快一些

//反正luogu那道素數篩模板這種方法是可以168ms過的,另外幾種最快的也要1000+

#include <cmath>
#include <cstdio>
inline int read()
{
    int n=0,w=1;register char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
    while(c>='0'&&c<='9')n=n*10+c-'0',c=getchar();
    return n*w;
}
inline bool check(int x)
{
    if(x==2||x==3)return true;
    if(x==1||(x%6!=1&&x%6!=5))return false;
    int y=sqrt(x);
    for(int i=5;i<=y;i+=6)
        if(!(x%i)||!(x%(i+2)))
            return false;
    return true;
}
int main()
{
    int n,m;
    n=read(),m=read();
    while(m--)
    {
        n=read();
        if(check(n))
            printf("Yes\n");
        else    printf("No\n");
    }
    return 0;
}
View Code

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章