筛素数
来源:互联网 发布:一楼土木人淘宝店没了 编辑:程序博客网 时间: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以内的所有素数三种方法基本无差别。
阅读全文
0 0
- 筛素数
- 素数筛
- 素数筛
- 素数筛
- 筛素数
- 素数筛
- 素数筛
- 筛素数
- 素数筛
- 素数筛
- 筛素数
- 筛素数
- 素数筛
- 素数筛
- 素数筛
- 素数筛
- 筛素数
- 素数筛
- css 中div不用设定高度,自动根据内容出现滚动条
- 亿级工具类APP头条数据聚合优化实践
- lnmp安装
- JAVA数据库连接池实现原理
- 数据结构(排序)
- 筛素数
- 卷积神经网络-----理解
- vb.net 教程 8-2 简单的SQL语言6
- 机器学习第二个算法KNN(最邻近规则分类KNN算法)
- 微信开发流程
- spring boot 整合quartz并进行jdbc持久化
- 阅读《吴军·硅谷来信》一年的回顾与思考
- 构建DevOps落地的自动化持续交付流水线
- 今天被一个架构师面了