幾種素數判定

轉自...咳咳,我看的那篇也是寫的轉載,so,原作者不詳

(1)最基本素數判定方法大家熟悉,只用看看2到n(或n的平方根)之間有沒有n的約數:

#include<stdio.h>
void main()
{
    int i,n;
    scanf("%d",&n);
    for(i=2;i<n;i++)
        if(n%i==0)break;
    if(i<n||n==1)puts("No");
    else puts("Yes");
}
此方法適用於判定較少數,數據量大時會超時。
(2)篩選法求素數也重要的求素數方法之一。這種方法主要用於打素數表,如求出n之內的所有素數,其思路是從1開始遇到一個素數就標記一下,並去掉n之內的大於它的所有倍數,直循環到n:
#include<stdio.h>
int n,i,j,a[1000001],p[100000],t=0;
void main()
{
    scanf("%d",&n);
    a[1]=0;
    for(i=2;i<=n;i++)a[i]=1;
    for(i=2;i<=n;i++)
        if(a[i]){
            p[t++]=i;
            for(j=i+i;j<=n;j+=i)a[j]=0;
        }
    for(i=0;i<t;i++)
        printf("%d%c",p[i],i<t-1?' ':'/n');
}
此方法也有侷限性,數據量中等時纔不會超時,數據量過大時也會超時,而且只能用素數打表,不能對單個數進行判定!
(3)這是我根據《離散數學》上的一個定理想到的,定理爲:“若正整數a>1,且a不能被不超過a的平方根的任一素數整除,則a是素數”,實現過程如下:
#include<stdio.h>
#include<math.h>
int p[1000000],a[10000001],t=0;
int prime(int n)
{
    int i,q;
    q=(int)sqrt(n);
    for(i=0;p[i]<=q&&t;i++)
        if(n%p[i]==0)return 0;
    return 1;
}
void main()
{
    int n,i;
    scanf("%d",&n);
    for(i=2;i<=n;i++)
        if(prime(i))p[t++]=i;
    for(i=0;i<t;i++)
        printf("%d%c",p[i],i<t-1?' ':'/n');
}
此方法可以對超大量數據的進行打表!
此方法也同樣合適於素數打表,判定單個時這個方法不可取!
(4)由方法(3)延伸出另一個素數判定方法:
#include<stdio.h>
#include<math.h>
int p[8]={4,2,4,2,4,6,2,6};
int prime(int n)
{
    int i=7,j,q;
    if(n==1)return 0;
    if(n==2||n==5||n==3)return 1;
    if(n%2==0||n%3==0||n%5==0)return 0;
    q=(int)sqrt(n);
    for(;i<=q;){
        for(j=0;j<8;j++){
            if(n%i==0)return 0;
            i+=p[j];
        }
        if(n%i==0)return 0;
    }
    return 1;
}
void main()
{
    int n;
    scanf("%d",&n);
    if(prime(n))puts("Yes");
    else puts("No");
}
這種方法既可以用於最快速地判定單個數,也可以用於判定超大量的數據。
此方法判定單個數時要比第(1)種方法要快得多,用於大量數據素數打表時稍遜於第(3)種方法,卻要比第(2)方法快得多。
這幾判定素數方法中我個人認爲第(4)種最好用,不過不容易理解,我也解釋不清楚(只可意會,不可信傳),大家看看哪個方法好用就用哪個吧!
發佈了31 篇原創文章 · 獲贊 24 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章