利用筛选法求素数可以极大地减少运算量。对于常见的求100或更小范围的素数,这种感觉可能不是很明显,但当范围扩大到100000甚至更大时,筛选法相较于普通求素数方法的优势便显而易见了(虽然之前也用过一些诸如:、、去掉偶数这样的方法来进行简化,但对于大范围的情况效果仍不如筛选法)。
筛选法的具体做法是先把N个自然数按次序排列起来。首先排除1,1后面的第一个数是2,由于2是质数所以留下,并把后面所有2的倍数都去掉。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去······以此类推,最后剩下的均为质数。
例:用筛选法求100之内的素数
上图为循环部分的流程图。程序显示如下:
#include <stdio.h>
#include <math.h>
int main()
{
int i, j, n, a[101];//0~100共101个数
for (i = 0; i <=100; i++)//其实这里循环条件可以写成i<=sqrt(100),或者是i<=50,因为对于一个范围内的因数,只能出现在前面,比如1~10中任意数的因数,只可能在0~5这个范围内,也就是说5之后的数不可能是这个范围内任意一个数的因数。
{
a[i] = i;
}
a[1] = 0;//a[1]不是质数,设为0
for (i = 2; i <=100; i++)
{
if (a[i] != 0)
{
for (j = i + 1; j <= 100; j++)
{
if (a[j] % a[i] == 0)
{
a[j] = 0;
}
}
}
}
printf("\n");
for (i = 2, n = 0; i < 100; i++)
{
if (a[i] != 0)
{
printf("%5d", a[i]);
n++;
}
if (n == 10)
{
printf("\n");
n = 0;
}
}
return 0;
}