素数筛(埃氏筛和欧拉筛)

欧拉筛是在埃氏筛基础上的一个改进

两者基本思想是差不多的,都是通过已找到的素数(该素数一定是后面某个合数的因子,因此在原数基础上再乘以一个非一正整数,得到的数字一定为合数)来判断后面的数是否为素数
先附上埃氏筛的代码

void isprime()//埃氏筛
{
    for(int i=2;i<maxn;i++)
    {
        if(!vis[i]) prime[++prime[0]]=i;
        for(int j=i*i;j<maxn;j+=i)
            vis[j]=1;

    }
    return ;
}

1.这里有个小技巧,用下标为0的变量用于存储个数
真正存储素数的数组是从1开始的
ps:在很多情况下我们会选择把0空出来,因为在处理输入输出的时候比较方便,0可以用于交换/存储个数。。。
2.有个小优化,就是在筛后面的素数的时候,是从i^2开始的,这样可以避免从i 到 i^2之间被重复筛,这里就不证明了(建议读者写几个试试看,会比较有感觉)

void isprime()//欧拉筛
{
    for(int i=2;i<=maxn;i++)
    {
        if(!vis[i])prime[++prime[0]]=i;
        for(int j=1;j<=prime[0]&&i*prime[j]<=maxn;j++)
        {
            vis[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }
    return ;
}

欧拉筛的最大改进之处在于它不用重复筛选(可以写个输出试试看)
原理是:prime[j]是素数,那么它乘以任何一个数都是合数,而当i是素数的倍数的时候,因为会重复筛(i=4,prime[j]=2的时候,会发现8是迟早会被筛到的,那这一次可以选择不用筛下去了)


ps:小白第一次写博客,写的不清楚的地方请见谅

学习了简单搜索的可以看一下这两个题(搜索和素数结合起来)
http://acm.hdu.edu.cn/showproblem.php?pid=1016
https://vjudge.net/problem/HDU-1973

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值