ACM模板 素数打表

下面的是  欧拉筛法  更快更方便更好用的进行素数打表

/*===================================================*\
  欧拉筛法 素数打表,该函数执行后
  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++;
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值