素数筛(打素数表)

在做某些题的时候,我们需要用到一个素数的有序表。一般打表的方法就是筛法。先贴代码

#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的素数筛选出来,只需走以下两个步骤:

  1. i从2遍历到n
  2. 若检测到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的下标就是素数。
代码很短,很简单。和普通的通过判断素数来筛选的方法就是用空间换取了时间。

猜你喜欢

转载自blog.csdn.net/Skyed_blue/article/details/88753635