线性筛法(素数筛)

一个O(n)时间复杂度的筛选质数的算法:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1000000;
int primes[N],cnt;//primes数组存放质数
int minp[N];//存放最小质因子
bool st[N];//当前有没有被筛选
void get_primes(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!st[i])minp[i]=i,primes[cnt++]=i;
        for(int j=0;primes[j]*i<=n;j++)//筛选质数
        {
            st[primes[j]*i]=true;
            minp[primes[j]*i]=primes[j];//primes[j]*i的最小质因子是priems
            if(i%primes[j]==0)break;//primes不大于i的最小质因子
        }
    }
}
int main()
{
    get_primes(10000);
    for(int i=2;i<20;i++)
    {
        cout<<primes[i]<<" "<<minp[i]<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_52797843/article/details/122611769