您的位置:首页 > 编程语言

质数筛法的代码优化极限

2017-03-24 22:39 197 查看
我敢打包票,我刚刚写的这个
质数筛法,求取范围区间 的质数(素数)个数,效率可以的~ 代码贴上。

对了,若是可以再牺牲点空间和内存,还可以进一步优化成 对数log,但对这个数量级的数据来说,这点效率的区别差别并不是很大。

#include <bits/stdc++.h>
using namespace std;
//质数筛法的优化极限
int const N = 100000000 +  3 ;
bool disPrime[ N ] = { true, true, false } ;
void setPrime( ){
int i=0, j=0 ;
for( i=4; i<N; ++i )   // 先把一般数量的偶数筛掉,不要通过 条件语句%2来判断是否为合数。。要直接用!
disPrime[ i++ ] = true ;    // 而且还可以把 i+=2;  改为++i 和 i++两条语句,没了赋值语句会更快。
for( i=3;  i*i<=N ; ++i )
if ( ! disPrime[ i ] )  // 此时的 i 为 不是 非质数, 也就是质数了。。。且保证未被筛过(避免重复筛选)
for( j = i*i ;  j < N  ;  j += i  )  // 第二个for循环语句放在if条件语句里,避免重复筛选
if( ! disPrime[ j ]) //避免重复复制,判断语句比复制拷贝要省时
disPrime[ j ] = true ;
}// 一举三得:1、故可以得出范围 2 ~ N 的质数个数为 prime.size() 2、也可以输出各个具体的质数 3、还可以单独用 disPrime[] 判断是否为质数。

int main(){
setPrime() ;
int num, Count ;
while( scanf("%d",&num) != EOF ){
Count = 0;
for(  int i=0;  i <= num ; ++i )
if( ! disPrime[ i ])
Count ++;
printf("Count = %d\n",Count) ;
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  质数 筛法 预处理