素数筛

质因数分解代码

int p[100005],m,c[100005];
void divide(int n){
    m=0;
    for(int i=2;i*i<=n;i++){
        if(n%i==0){//i是质数 
            p[++m]=i;c[m]=0;
            while(n%i==0) n/=i,c[m]++;//除掉所有的i 
        }
    }
    if(n>1)
    p[++m]=n,c[m]=1;
    for(int i=1;i<=m;i++)
    cout<<p[i]<<"^"<<c[i]<<endl;
}

素数判断代码:根号n

bool isprime(int a){
    if(a<=1) return 0;
    for(int i=2;i<=sqrt(a);i++)
    if(a%i==0) return 0;
    return 1;
} 

Eratosthenes筛选法nloglogn

思路:质数的倍数一定不是质数

int v[100005];
void primes(int n){
    memset(v,0,sizeof(v));//合数标记
    for(int i=2;i<=n;i++){
        if(v[i]) continue;
        cout<<i<<endl;
        for(int j=i;j<=n/i;j++)
        v[j*i]=1;
    } 
}

线性筛法

const int MAXN=1000005;
int v[MAXN],prime[MAXN],m;
void primes(int n){
    memset(v,0,sizeof(v));
    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/i) break;
            v[i*prime[j]]=prime[j];
        }
    }
    for(int i=1;i<=m;i++)
    cout<<prime[i]<<endl;
}
原文地址:https://www.cnblogs.com/yfr2zaz/p/10435342.html