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++;
        }
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章