エラトシニふるい


エラトセニふるい法は一定範囲の素数を求めるために用いられる.
1つ目の方法:
原理は配列要素に数値を格納し、非素数と判定されるとその値を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 :
     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の配列要素の下付き文字.原理は、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;