素数表:埃氏素筛 及 欧拉筛

本文详细介绍了两种常见的素数筛选算法:埃氏素数筛选法和欧拉筛法。埃氏素筛的时间复杂度为O(N⋅loglogN),通过标记合数来找到所有小于等于N的素数。欧拉筛法是一种更高效的线性筛法,时间复杂度为O(N),通过对每个非素数只筛选一次,避免了重复工作,提高了效率。

一、埃氏素数筛选法

  • 时间复杂度O(N⋅log⁡log⁡N)O(N\cdot\log{\log N})O(NloglogN)
int prime[maxn],tot;
bool vis[maxn];
void get_prime()    //埃氏素筛
{
    memset(vis,0,sizeof(vis));
    tot=0;
    for(int i=2;i<=maxn;i++)
    {
        if(vis[i])
            continue;
        prime[++tot]=i;
        for(int j=i;j<=maxn;j+=i)
            vis[j]=true;
    }
}


二、欧拉筛法(推荐)

  • 时间复杂度O(N)O(N)O(N),故又称为 线性筛

埃氏素筛存在部分重复筛选,而欧拉筛对每个非素数只筛选一次,从而达到线性的时间复杂度。

int prime[maxn],tot;
bool vis[maxn];
void get_prime()       //欧拉筛
{
    memset(vis,0,sizeof(vis));
    tot=0;
    for(int i=2;i<=maxn;i++)
    {
        if(!vis[i])
            prime[++tot]=i;
        for(int j=1;j<=tot&&i*prime[j]<=maxn;j++)   //筛去i*已有质数
        {
            vis[i*prime[j]]=true;
            if(i%prime[j]==0)    //控制筛选范围,防止重复筛选
                break;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值