ACM模板 素數打表
阿新 • • 發佈:2019-01-26
下面的是 尤拉篩法 更快更方便更好用的進行素數打表
/*===================================================*\ 尤拉篩法 素數打表,該函式執行後 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++; } } }