常见素数筛法
2014-12-08 14:10
246 查看
列出几种常用的素数筛选法,附上计时器。。。
#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; }
相关文章推荐
- 常见数据库分页SQL语句
- [导入]web标准常见问题大全 让FireFox与IE兼容
- DNS记录中几种常见的记录
- C语言常见排序算法
- 操作系统常见面试题总结
- 链表常见笔试题
- iOS 常见的闪退错误
- 关于TCP/IP数据包结构一文的进一步说明(常见协议数据报结构及TCP三次握手机制)
- Linux其他常见压缩备份工具 - dd,cpio
- 生产订单结算KKS1常见错误
- Python--常见问题解决方案
- java常见异常与错误
- ElasticSearch 5.0 客户端访问常见问题
- Python常见error
- 【安全牛学习笔记】XSS-简介、跨站脚本检测和常见的攻击利用手段
- 字符不会撑大表格的常见css样式
- linux常见命令
- 常见的数据库错误的解决方法!必看!(含安装插件常见错误)
- 常见J2ME系统属性及其作用列表
- SQL点滴26—常见T-SQL面试解析