埃拉托色尼篩法

埃拉托色尼篩法用於求一定範圍內的素數。

第一種方法:

原理是在數組元素中存放數值,若判定爲非素數則將其值修改爲0,輸出時會跳過值爲0的元素。

  1. //埃拉托色尼篩法  
  2.   
  3. #include <iostream> 
  4. #include <iomanip>  
  5. #define NUM 100 
  6. #define W 2 
  7. using namespace std; 
  8.   
  9. int main(int argc,char * argv[]) 
  10.     int array[NUM/2]; 
  11.     int sign,flag; 
  12.   
  13.     //給數組賦值 
  14.     for(sign=0,flag=3;sign<NUM/2-1;sign++) 
  15.     { 
  16.         array[sign]=flag; 
  17.         flag+=2; 
  18.     }  
  19.   
  20.     //對數組進行篩選 
  21.     for(sign=0;sign<NUM/2-1;sign++) 
  22.     { 
  23.         if(array[sign]) 
  24.         { 
  25.             for(flag=sign+1;flag<49;flag++) 
  26.             { 
  27.                 if(!(array[flag]%array[sign])) 
  28.                 { 
  29.                     array[flag]=0; 
  30.                 } 
  31.             } 
  32.         } 
  33.     }  
  34.   
  35.     //輸出素數組 
  36.     cout<<"100以內的素數有:\n 2\t"
  37.     flag=1; 
  38.     for(sign=0;sign<NUM/2-1;sign++) 
  39.     { 
  40.         if(array[sign]) 
  41.         { 
  42.             cout<<setw(W)<<array[sign]<<'\t'
  43.             flag+=1; 
  44.             if(!(flag%5)) 
  45.             { 
  46.                 cout<<endl; 
  47.             } 
  48.         } 
  49.     }  
  50.     cout<<endl; 
  51.   
  52.     return 0; 

代碼中會反覆出現 NUM/2-1 的原因:
if sign<=50 最後判斷的數字爲 3+2*50=103 超出了上限100
if sign<=49 最後判斷的數字爲 3+2*49=101 超出了上限100
if sign<49(即sign<=48) 最後判斷的數字爲 3+2*48=99 在範圍之內
至於爲什麼是 NUM/2-1 ,在原理上想不通怎麼解釋,只是在運行過程中觀察結果得出的結論。

另一種方法:

用數組的下標存放數值,數組中各元素的值用0和1表示是不是素數。最終輸出值爲1的數組元素的下標。
原理是,發現一個數,然後在後面的所有數中刪除它的倍數(賦值爲0)。

  1. //埃拉托色尼篩法  
  2.   
  3. #include <iostream> 
  4. #include <iomanip> 
  5. #define N 100 
  6. #define W 2 
  7. using namespace std; 
  8.   
  9. int main(int argc,char *argv[]) 
  10.     int array[N]={0},sign,flag,i=0; 
  11.   
  12.     cout<<N<<"以內的素數有:"<<endl;  
  13.     for(sign=2;sign<N;sign++) 
  14.     { 
  15.         if(array[sign]==0) 
  16.         { 
  17.             cout<<setw(W)<<sign<<" "
  18.             i++; 
  19.             //每輸出5個值後換行  
  20.             if(i%5==0) 
  21.             { 
  22.                 cout<<endl; 
  23.             } 
  24.         } 
  25.         for(flag=1;sign*flag<=N;flag++) 
  26.         { 
  27.             array[sign*flag]=1; 
  28.         } 
  29.     } 
  30.   
  31.     return 0; 

 

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