您的位置:首页 > 其它

ACM模板 素数打表

2014-07-16 11:21 543 查看
下面的是 欧拉筛法 更快更方便更好用的进行素数打表

/*===================================================*\
欧拉筛法 素数打表,该函数执行后
prim[]数组中存入[2,N]区间内的所有素数(从prim[0]开始存入)
isPrime[i] 表示整数 i 是否为素数
函数返回[2,N]之间的素数的个数
\*===================================================*/
const int N = 1000000;
bool isPrime[N+10];
int prim[80000]; //要注意保证pirm[]数组足够存储[2,N]之间的素数
int prime(){
int num = 0;
memset(isPrime,true,sizeof(isPrime));
isPrime[0] = isPrime[1] = false;
for(int i=2 ; i<=N ; i++){
if( isPrime[i] ) prim[num++] = i;
for(int j=0 ; j<num ; j++){
if( i*prim[j]>N ) break;
isPrime[ i*prim[j] ] = false;
if( i%prim[j] == 0 ) break;
}
}
return num;
}


下面的算法提供快速的素数打表

/*=================================*\
素数打表
该函数执行后在prim[]数组中存入
从2开始的从小到大的numOfPrim个素数
\*=================================*/
const int numOfPrim = 1000;
int prim[numOfPrim] = {2,3};
void prime(){
int tally=2;
bool flag;
for(int i=5 ; tally<numOfPrim ; i+=2){
flag = true;
for(int j=0 ; prim[j]*prim[j]<=i ; j++)
if( i%prim[j]==0 ){ flag = false; break; }
if( flag ){
prim[tally]=i;
tally++;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: