线性素数筛法(欧拉筛法)

概括

首先说一下欧拉筛法的时间复杂度为O(N),这也是目前来说我知道的最快的素数筛法了,而且他是把素数都筛选了出来,跟埃式筛法不一样的是,每个素数都加进了素数表里面,埃式筛法紧紧是一个判断

思路

既然是O(N)的算法那么肯定是要线性走一遍2到maxn这个闭区间的,然后类似于埃式筛法如果当前的数没有被打上标记,那么加入到素数表里面,然后也类似于埃式筛法进行一波枚举,这里不同的是欧拉筛法是把当前的数与之前的素数表里面的数进行相乘而埃式筛法是直接把所有的2倍3倍4倍…都筛选了出来
然后最最重要的优化是
如果当前的i能够整除当前枚举的这个素数,那么就结束内层的枚举倍数算法这样能够保证每个合数都被筛选了一遍
因为要保证当前的素数不会被之后的筛选到!!!

代码

筛选前100个素数,使用欧拉筛法

#include <bits/stdc++.h>
using namespace std;
int bk[1000005],prime[1000005];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int cnt=0;
  for(int i=2;i<=1000000;i++)
  {
    if(!bk[i])
    prime[++cnt]=i;
    for(int j=1;j<=cnt&&i*prime[j]<=1000000;j++)
    {
      bk[i*prime[j]]=1;  
      if(i%prime[j]==0)  
      break;
    }
  }
  for(int i=1;i<=100;i++)
  cout<<prime[i]<<" ";
}
就算是一分钱,也是对作者极大的支持
------ 本文结束 ------

版权声明

Baccano by baccano is licensed under a Creative Commons BY-NC-ND 4.0 International License.
baccano创作并维护的Baccano博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于baccano 博客( http://baccano.fun ),版权所有,侵权必究。

小游戏

---小游戏:要不要来选择一下自己可能的老婆?---

简易发声器

---简易的七键钢琴插件---

可以使用鼠标点击琴键也可以使用主键盘1-7或者小键盘的1-7来操作

那么现在开始吧

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
0%