埃拉托色尼篩法用於求一定範圍內的素數。
第一種方法:
原理是在數組元素中存放數值,若判定爲非素數則將其值修改爲0,輸出時會跳過值爲0的元素。
- //埃拉托色尼篩法
- #include <iostream>
- #include <iomanip>
- #define NUM 100
- #define W 2
- using namespace std;
- int main(int argc,char * argv[])
- {
- int array[NUM/2];
- int sign,flag;
- //給數組賦值
- for(sign=0,flag=3;sign<NUM/2-1;sign++)
- {
- array[sign]=flag;
- flag+=2;
- }
- //對數組進行篩選
- for(sign=0;sign<NUM/2-1;sign++)
- {
- if(array[sign])
- {
- for(flag=sign+1;flag<49;flag++)
- {
- if(!(array[flag]%array[sign]))
- {
- array[flag]=0;
- }
- }
- }
- }
- //輸出素數組
- cout<<"100以內的素數有:\n 2\t";
- flag=1;
- for(sign=0;sign<NUM/2-1;sign++)
- {
- if(array[sign])
- {
- cout<<setw(W)<<array[sign]<<'\t';
- flag+=1;
- if(!(flag%5))
- {
- cout<<endl;
- }
- }
- }
- cout<<endl;
- 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)。
- //埃拉托色尼篩法
- #include <iostream>
- #include <iomanip>
- #define N 100
- #define W 2
- using namespace std;
- int main(int argc,char *argv[])
- {
- int array[N]={0},sign,flag,i=0;
- cout<<N<<"以內的素數有:"<<endl;
- for(sign=2;sign<N;sign++)
- {
- if(array[sign]==0)
- {
- cout<<setw(W)<<sign<<" ";
- i++;
- //每輸出5個值後換行
- if(i%5==0)
- {
- cout<<endl;
- }
- }
- for(flag=1;sign*flag<=N;flag++)
- {
- array[sign*flag]=1;
- }
- }
- return 0;
- }