首页 > 代码库 > 常见素数筛法
常见素数筛法
列出几种常用的素数筛选法,附上计时器。。。
#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 0 for(int i=2; i<=MAXN; i++) if(vis[i]==true) u++; cout<<u<<endl; #endif u=1; for(int i=0; i<len; i++) if(vis[i]==true) u++; cout<<u<<endl; return 0; }
常见素数筛法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。