在做某些题的时候,我们需要用到一个素数的有序表。一般打表的方法就是筛法。先贴代码
#include <cstdio>
using namespace std;
int P[20000];
void Prime(int n) //素数筛打表
{
P[1] = 1; //1非质数
for(int i = 2;i < n;i++)
{
if(P[i] == 0) //若i为质数
{
for(int j = 2*i;j < n;j += i) //将i的倍数全部筛出去
P[j] = 1;
}
}
}
int main()
{
int n;
scanf("%d",&n);
Prime(n);
for(int i = 2;i < n;i++)
{
if(!P[i])
printf("%d ",i);
}
printf("\n");
return 0;
}
首先,假设所有数都是素数。若要将2-n的素数筛选出来,只需走以下两个步骤:
- i从2遍历到n
- 若检测到i为素数,将i的所有倍数都筛掉(P[j] = 1)
举个例子:
i = 2, 则4,8,10,12…都被筛掉。
i = 3, 则6,9,12,15…都被筛掉。
i = 4, 被筛掉了,跳过。
i = 5, 则10,15,20,25…都被筛掉
i = 6,跳过
i = 7, 14, 28…筛掉
… …
最后P[] = 0的下标就是素数。
代码很短,很简单。和普通的通过判断素数来筛选的方法就是用空间换取了时间。