所謂“篩選法”是指“厄拉多塞篩選法”。他是古希臘著名的數學家。他的方法是把1到100的所有整數寫在壹張紙上,然後逐個判斷是否是質數,找出壹個非質數,把它挖出來,最後剩下的就是質數。
具體做法如下:
& lt1 & gt;先挖出1(因為1不是質數)。
& lt2 & gt把後面的數除以2,挖出能被2整除的數,也就是挖出2的倍數。
& lt3 & gt把後面的數字除以3,挖出3的倍數。
& lt4 & gt用數字4、5…作為除數來除數。這個過程壹直持續到除數之後的所有數字都被挖出。比如求1 ~ 50的質數,要壹直持續到除數為47(其實可以簡化。如果需要在1 ~ n的範圍內尋找素數表,只需要走到除數為n ^ 2(根號n)並取其整數即可。比如1 ~ 50,只能用50 ^ 2做除數。)
上述算法可以表示為:
& lt1 & gt;挖出1;
& lt2 & gt用剛挖出的數的下壹個數p除以p後的數,挖出p的倍數;
& lt3 & gt檢查p是否小於n ^ 2的整數p<(如果n=1000,檢查p
& lt4 & gt紙上剩下的數字是質數。
# include & ltstdio.h & gt
# include & ltmath.h & gt
int main(void)
{
int I;
int j;
int a[101];//對於可視化表示,每個元素對應壹個下標,不使用元素0。
for(I = 1;我& lt= 100;I++) //數組中每個元素的賦值
a[I]= I;
for(I = 2;我& ltsqrt(100);I++) //外循環使I成為除數。
for(j = I+1;j & lt= 100;J++) //內循環檢測除數I後面的數是否是I的倍數。
{
如果(a[i]!= 0 & amp& ampa[j]!= 0) //排除零值元素
if (a[j] % a[i] == 0)
a[j]= 0;//如果I後面的數是I的倍數,就設為0(截出)即可。
}
int n = 0;//統計輸出質數,控制換行顯示。
for(I = 2;我& lt= 100;I++) //輸出質數
{
如果(a[i]!= 0)
{
printf("%-5d ",a[I]);//輸出數組中的非零元素(未挖掘的數)
n++;
}
如果(n == 10)
{
printf(" \ n ");//每行10個輸出
n = 0;
}
}
printf(" \ n ");
返回0;
}
運行結果(VC):
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97