1.基本思想
把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。
2.示例
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
1)1不是素数,去掉。剩下的数中 2 最小,是素数,去掉 2 的倍数。
12 34567891011
12131415161718192021
222324252627282930
2)剩下的数中,3 最小,是素数,去掉 3 的倍数。
2 3 5 7
911 13
1517 19
2123 252729
3)直到所有的数被筛完
2 3 5 7
11 13 17 19
23
2529
4)求出的素数为:
2 3 5 7 11 13 17 19 23 29
3.代码实现
//----*----*----*-----
//程序名称:筛法求素数
//编译环境:VC++ 6.0
// 作 者:Bee_darker
//修改日期:2018-11-01
//----*----*----*-----
#include "stdio.h"
#define MAX 30 //求MAX范围内的素数
bool isprime[MAX]; //布尔型变量
int su[MAX],count = 0; //全局变量
//判断函数
void prime()
{
int i,j;
for(i = 0;i <= MAX;i++)
isprime[i] = 1; //认为所有数都是素数
isprime[0] = isprime[1] = 0; //0和1不是素数
for(i = 2;i <= MAX;i++)
{
if(isprime[i])
su[count++] = i; //保存素数
for(j = i*2; j <= MAX;j += i)
isprime[j] = false; //去除素数的倍数
}
}
int main()
{
prime();
int i;
for(i = 0;i < count;i++) //输出素数
printf("%d ",su[i]);
return 0;
}