尤其要注意注释中所提到的“窍门”和“陷阱”。
#include <iostream>
using namespace std;
int main()
{
int a = 3, b = 11;
bool sieve[b + 1];
for(int i = 2; i <= b; i++) //这个循环用来给筛子赋初值;尤其要注意 i 从 2 开始,不可以从 a 开始,否则 d = 2 时 if 判断会出错,而且编译系统不报错
sieve[i] = true;
for(int d = 2; d * d <= b; d++) //这个循环用枚举因子法判断素数
if( sieve[d] ) //如果 d 没有被筛掉
for(int n = d * d; n <= b; n += d)
{
sieve[n] = false; //把非质数 n 筛掉
cout << "n1 = " << n << endl; //测试代码
}
for(int i = a; i <= b; i++)
if( sieve[i] )
cout << i << ' ';
cout << endl;
return 0;
}
运行结果中,测试代码显示前4个被筛掉的数是4,6,8,10,第5个才是9,因为9是被3作为基数筛掉的,前面4个都是被2作基数筛掉的。