篩法求小於等於整數n的所有質數
篩法求n以下的質數最核心的是確定其倍數未消去的最大數p應該滿足的條件。要消去q的倍數,最小應該從q*q考察起(因為其他跟小的倍數已經由2p,3p。。。(p-1)*p消去了) 那麼消去q的倍數只需從q*q開始 到n結束(滿足不等式q*q <=n).
以下是測試程式碼:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define Maxsize 25
// 篩法求n以內的素數
void sieve(int a[],int n)
{
int i,j,m,s=0;
int k = (int)sqrt(n);
for(i = 1; i <= k ; i++)
{
if(a[i] != 0)
{
j=a[i]*a[i];
while(j <= n)
{
a[j-1] = 0; //將該元素的標記標為零
j = j + a[i];
}
}
}
for(m = 0 ; m < n ; m++) //列印篩選出來的質數
{
if(a[m] >= 2)
{
printf("%d ",a[m]);
s++;
}
}
printf("/n");
printf("%d/n" , s); //輸出篩選質數個數
}
void main()
{
int i;
int array[Maxsize];
for(i = 0 ; i < Maxsize; i++)
array[i] = i+1; //將陣列賦值為1...n
sieve(array,Maxsize);
}