筛素数

来源:互联网 发布:一楼土木人淘宝店没了 编辑:程序博客网 时间:2024/05/18 03:25

ACM比赛中经常能遇到关于素数的题目,可能需要我们预处理求出100W,1000W以内的所有素数。笔者在这里介绍共三种筛素数的方法,代码如下:

#include <cstdio>  #include <cstring>  #include <algorithm>  using namespace std;  const int maxn=100000000;  int prime[maxn];  int primeNum;  bool h[maxn];  // 普通版  void calPrime()  {      for(int i=2;i<maxn;i++) if(!h[i])      {          prime[primeNum++]=i;          for(int j=i+i;j<maxn;j+=i)              h[j]=true;      }      printf("%d\n", primeNum);  }  // 优化版  void calPrime2()  {      for(int i=2;i<maxn;i++) if(!h[i])      {          prime[primeNum++]=i;          if(maxn>(long long)i*i) for(int j=i*i;j<maxn;j+=i)              h[j]=true;      }      printf("%d\n", primeNum);  }  // 欧拉筛法  void calPrime3()  {      for(int i=2;i<maxn;i++)      {          if(!h[i]) prime[primeNum++]=i;          for(int j=0;j<primeNum;j++)          {              if(i*prime[j]>maxn) break;              h[i*prime[j]]=true;              if(i%prime[j]==0) break;          }      }      printf("%d\n", primeNum);  }  int main()  {      calPrime();  //    calPrime2();  //    calPrime3();  }  

求1亿以内的所有素数,普通方法大概4.4S,优化版大概2.9S,欧拉筛法大概1.5S,优化程度还是很高的。
当然,只求100W以内的所有素数三种方法基本无差别。

原创粉丝点击