/*利用筛选法求素数;采用条件编译来打印或取消打印中间过程*/
/*数组numbers中存放的元素值为1表示是合数,值为0表示是素数*/
#include<stdio.h>
#define MAX_NUM 25
#define DEBUG
#undef DEBUG
int main(int argc,char *argv[])
{
unsigned int numbers[MAX_NUM+1]={0};
unsigned int i,j,flag=0;
for(i=2;i<=MAX_NUM;i++)//i从2开始
{
#ifdef DEBUG
flag=0; //打印标志,为0时表示本轮没有排除i的倍数
#endif
if(numbers[i]==0)//若前一次遍历未被排除
{
for(j=i+i;j<=MAX_NUM;j+=i)//能被2,3,5......等整除的一律排除置1
{
numbers[j]=1;//被排除的数j,对应数组元素值为1
#ifdef DEBUG
printf(" %d ",j);//打印本轮被排除的数
flag=1;//打印标志,为1时表示本轮有i的倍数
#endif
}
#ifdef DEBUG
if(flag==1)printf(" : %d 的倍数,被筛除\n",i);//打印本轮被排除的数
#endif
}
}
printf("\n------剩余素数列表--------\n");
for(i=2;i<=MAX_NUM;i++)//i从2开始
{ if(numbers[i]==0)printf(" %d ",i);//值为0的便是剩下的素数
}
putchar('\n');
return 0;
}