1. 程式人生 > >篩選法尋找素數——學習筆記

篩選法尋找素數——學習筆記

給定數字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;
}