筛法求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);
}