1. 程式人生 > >篩法求小於等於整數n的所有質數

篩法求小於等於整數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);   
}