星星之火OIer:素数筛法

这一讲中我们来谈一谈素数的筛法

一共有3种常用的筛法

目录

——线性筛

——埃拉托斯特尼筛法

——欧拉筛法


O(\sqrt{n^3})=O(n\sqrt{n})——线性筛

只要用for循环一下,然后用\sqrt{n}的时间复杂度判断一下就好了

最简单,但时间复杂度最高

代码如下::

for(int i=l;i<=r;i++)
    for(int j=2;j<=int(sqrt(i));j++)
        if(i%j==0) {
            flag[i]=1;
            break;
        }

O(nlogn)——埃拉托斯特尼筛法

原理:从2开始,如果这个数还没被筛掉,那这个数就是素数,然后将n以内的这个数的倍数筛掉

代码还是很好实现,时间复杂度居中

代码::

for(int i=2;i<=r;i++)
    if(flag[i]==0)
        for(int j=i*i;j<=r;j+=i)
            flag[j]=1;

O(n)——欧拉筛法

在这个算法中,两层都是枚举质数

两个质数的乘积一定是合数

而且这个里面每一个数只被筛了一次

所以算法是O(n)

 

for(int i=2;i<=n;i++) {
	if(!h[i])
		p[++cnt]=i;
	for(int j=1;j<=cnt&&i*p[j]<=N;j++)
		h[i*p[j]]=1;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值