篩選法尋找素數——學習筆記
阿新 • • 發佈:2018-12-09
給定數字N,要求找到小於N的所有素數的個數。
我們需要對小於N的每個數x進行判斷,判斷是否為素數。
我們可以在[2,x-1]之間找x的因素,也可以在[2,sqrt(x)]之間找,當然平方根內查詢速度更快。
我來介紹一種更快的方法——篩選法。時間複雜度O(Nlog(logN))。
篩選法原理在於:
1.先建立一個長度為N的陣列(陣列下標正好對應[0,N-1]),先假設每一個數都可能是素數
2.然後從2開始(0,1均不是素數)往後找,每當找到一個素數y時,就把y所有倍數ky(k=2,3,4,,,,(ky<N))找出來排除掉
3.由於素數的倍數都排除掉了(非素數除了0,1以外均由素數因子構成),最後剩下的就是素數了
看程式碼:
//返回值N以內素數的個數 int Prime(int N){ //建立長度為N的陣列,初始值為false bool* prime=(bool*)calloc(N,sizeof(bool)); int count=0; for(int i=2;i<N;i++){ //非素數,continue if(prime[i]){ continue; } //列印素數 printf("The %d prime:%d\n",++count,i); //排除素數的倍數 for(int j=i+i;j<N;j+=i){ prime[j]=true; } } //釋放記憶體,返回 free(prime); return count; }