质数筛选(详细解释以及模板)(Eratosthenes)
2016-01-31 00:36
323 查看
要求: 筛法构造1-n的素数表
筛法的思想特别简单,对于不超过n的每个非负整数p,删除2p,3p,4p.......,
当处理完所有数之后,还没有被删除的就是素数。如果用p[i]表示i已经被删除,代码可以这样写
以上代码时间复杂度O(nlongn) ,尽管时间复杂度已经很高效了,还是可以改进。
下面这份代码主要用于改进,首先,对于不超过n的每个非负整数p,p可以限定为素数。只需要在第二重循环前加 if(!p[i])即可
另外,内循环也不必从i*2开始--塔已经在i=2被筛选掉了,改进后代码如下。
互相学习,共同进步,如果觉得有不妥的地方还望指出来,小生刚出道。
如果觉得还可以,可否给小弟第一下,以表示估计,感激不尽。
你的鼓励将是我莫大的前进动力。
筛法的思想特别简单,对于不超过n的每个非负整数p,删除2p,3p,4p.......,
当处理完所有数之后,还没有被删除的就是素数。如果用p[i]表示i已经被删除,代码可以这样写
<span style="font-size:24px;">const int maxn=10000; int p[maxn]; //使用质数筛法 void prime() //没有优化 { memset(p,0,sizeof(p)); for(int i=1;i<=n;i++) for(int j=2*i;j<=n;j+=i) p[i]=1; }</span>
以上代码时间复杂度O(nlongn) ,尽管时间复杂度已经很高效了,还是可以改进。
下面这份代码主要用于改进,首先,对于不超过n的每个非负整数p,p可以限定为素数。只需要在第二重循环前加 if(!p[i])即可
另外,内循环也不必从i*2开始--塔已经在i=2被筛选掉了,改进后代码如下。
<span style="font-size:24px;">void prime_1() //优化。 { memset(p,0,sizeof(p)); p[1]=1; //1不是质数 int m=sqrt(maxn+0.5); for(int i=2;i<=m;i++) //1-maxn 质数筛选 { if(!p[i]) //如果p[i]=1;表示i以及i的倍数已经被筛选掉了 for(int j=i*i;j<=maxn;j+=i) p[j]=1; } } </span>
互相学习,共同进步,如果觉得有不妥的地方还望指出来,小生刚出道。
如果觉得还可以,可否给小弟第一下,以表示估计,感激不尽。
你的鼓励将是我莫大的前进动力。
相关文章推荐
- 献给初学iOS的小盆友们——微博app项目开发之十六搭建发送微博界面(上)
- mongodb的读写分离
- ERROR: 1004 Can't create file '/tmp/#sql1b62_1_0.frm' (errno: 13)
- SpriteFrameCache精灵框使用
- nrf52 sdk第一次编译出错的解决方法
- 虚拟化 创建虚拟主机
- DNS分别在什么情况下使用UDP和TCP
- 项目第一天
- LeetCode 144:Binary Tree Preorder Traversal
- Html的第一次小结
- Longest Increasing Path in a Matrix
- NativeXML使用有感
- 如何收藏第四套人民币大全套
- 自动化运维-自动化工具其实只是个噱头
- spring +Maven xml 配置示范。
- Android动画三部曲之一 View Animation & LayoutAnimation
- Linux 主流架构运维工作简单剖析
- Python内部执行过程
- 利用values来反向查询key,有没有简单的方法呢?
- Cocos2d-x 用lambda表达式实现监听,改变精灵的透明度和层级