常见素数筛法

来源:互联网 发布:fkshow软件安卓版 编辑:程序博客网 时间:2024/06/08 00:27

列出几种常用的素数筛选法,附上计时器。。。

#include<cstdio>#include<cstdlib>#include<cmath>#include<map>#include<queue>#include<stack>#include<vector>#include<algorithm>#include<cstring>#include<string>#include<iostream>#include<windows.h>#define ms(x,y) memset(x,y,sizeof(x))const int MAXN=90000000;const int INF=1<<30;const int sq=(int)sqrt(double(MAXN));  using namespace std;int u;int len;bool vis[MAXN+5];int prime[1000000];/* * 奇数筛法,(偶数肯定不是素数,故只需要判断奇数即可)即是vis数组里面虚拟的值都是奇数 */void print_prime()  {  if(MAXN&1==0) len=MAXN/2-1;else len=(MAXN+1)/2-1;bool *p;    for(int i=0; i*i<len; i++){        if(vis[i]){int b=2*i+3;//第i个奇数的值            for(p=vis+i+b; p<vis+len; p+=b) *p=false;        }      }  }  /* * 普通筛法 */void print_prime1(){for(int i=2; i*i<=MAXN; i++){if(vis[i]==true){for(int j=i*i; j<=MAXN; j+=i) vis[j]=false;}}}/* * 减少重复筛选 */void print_prime2(){for(int i=2; i<=MAXN; i+=2)vis[i] = false;vis[2] = true;for(int i=3; i*i<=MAXN; i++){if(vis[i]==true){for(int j=i*i; j<=MAXN; j+=2*i) vis[j]=false;}}}/* * 小数据常用方法 */void print_prime3(){for(int i=2; i<=MAXN; i++){int ok=1;for(int j=2; j*j<=i; j++){if(i%j==0){ok=0;break;}}}}int main(){ms(vis,true);FILETIME beg,end;//<windows.h>里的计时器GetSystemTimeAsFileTime(&beg);print_prime2(); GetSystemTimeAsFileTime(&end);long time = 100*(end.dwLowDateTime-beg.dwLowDateTime);cout<<time<<endl;#if 0for(int i=2; i<=MAXN; i++) if(vis[i]==true) u++; cout<<u<<endl;#endifu=1;for(int i=0; i<len; i++) if(vis[i]==true) u++; cout<<u<<endl;return 0;}


0 0
原创粉丝点击