【数论学习笔记】质数

  质数判定:

    试除法:2到sqrt(n)全部试除。代码如下。

inline bool prime1(int n){
    if(n<2) return 0;
    for(int i=2;i<=sqrt(n);i++)
        if(n%i==0) return 0;
    return 1;
}

  质数筛法:

    Eratosthenes筛法:所有质数的倍数全部为合数,每求到一个质数,统计倍数。代码如下。

int v[maxn];
inline void prime2(int n){
    memset(v,0,sizeof(v));
    for(int i=2;i<=n;i++){
        if(v[i]) continue;
        printf("%d ",i);
        for(int j=i;j<=n/i;j++) v[i*j]=1;
    }
}

    线性筛法:

      1. 2到 N 的每一个数若 v[i]=i 则为质数。

      2.扫描不大于v[i]的每一个质数p,令v[i*p]=p,也就是记录最小的质因子。

      代码如下。

int prime[maxn],v[maxn];
inline void prime3(int n){
    memset(v,0,sizeof(v));
    int m=0;
    for(int i=2;i<=n;i++){
        if(v[i]==0){v[i]=i;prime[++m]=i;}
        for(int j=1;j<=m;j++){
            if(prime[j]>v[i]||prime[j]>n) break;
            v[i*prime[j]]=prime[j];
        }
    }
    for(int i=1;i<=m;i++) printf("%d ",prime[i]);
}

猜你喜欢

转载自www.cnblogs.com/ChrisKKK/p/10833536.html
今日推荐