大量数据(几亿)里筛素数
2016-03-11 09:35
183 查看
原理:首先利用C的底层函数memset将整个数据一开始都置为素数。
然后开始考虑,一般来说素数的倍数肯定是合数了,所以我们可以用素数乘以其他整数来置部分数据为合数,其余数据则是素数。
但这样有个问题:重复计算太多,对于数据量很大,这种做法不可取。
具体那些重复了呢:当数为9时,用9乘以素数2;当数为6时,6乘以素数3;因此18被重复计算了。
为什么呢?因为我们采用的是当前的数会去乘以所有比它小的素数。
改进做法:9*2与6*3,我们取9*2。我们发现6是3的倍数,对于这种情况会经常重复计算,所以我们需要避免这种情况,可以当发现当前循环的数已是某个素数的倍数时,那么后面的素数可以都不用再和它相乘了。
然后开始考虑,一般来说素数的倍数肯定是合数了,所以我们可以用素数乘以其他整数来置部分数据为合数,其余数据则是素数。
但这样有个问题:重复计算太多,对于数据量很大,这种做法不可取。
具体那些重复了呢:当数为9时,用9乘以素数2;当数为6时,6乘以素数3;因此18被重复计算了。
为什么呢?因为我们采用的是当前的数会去乘以所有比它小的素数。
改进做法:9*2与6*3,我们取9*2。我们发现6是3的倍数,对于这种情况会经常重复计算,所以我们需要避免这种情况,可以当发现当前循环的数已是某个素数的倍数时,那么后面的素数可以都不用再和它相乘了。
const int MAX=100; bool flag[MAX]; int primes[MAX/3],pi; void GetPrimes() { int i,j; pi=0; memset(flag,false,sizeof(flag)); for(i=2;i<MAX;i++) { if(!flag[i]) primes[pi++]=i; for(j=0;(i<pi)&&(i*primes[j]<MAX);j++) { flag[i*primes[j]]=true; if(i%primes[j]==0) break; } } }
相关文章推荐
- Windows Embedded Standard 8 入门指南 1 of 5
- MyEclipse修改项目名称
- Java 标注(Annotation)详解
- Idea基本设置
- Android OpenGL 播放视频学习
- 制作GIF动画
- GeoHash核心原理解析
- HDU-1372-Knight Moves
- listview checkbox重复选择的问题
- Redis内存使用优化与存储
- 网络性能评估工具iperf
- Gradle命令和配置
- 在IBW中的Windows PE阶段调用自定义应用程序应注意的路径问题
- Spark map-side-join 关联优化
- bootstrap-model-弹出框背景禁止点击
- kk-并发控制和处理
- OpenCV Mat转IplImage陷阱
- 大臣的旅费
- 【游】皇室战争体验分析
- android跳转登陆界面