素数筛(打素数表)

在做题时有时需素数有序表,常用筛法打表。先假设所有数为素数,从2遍历到n,若检测到i为素数,就筛掉i的所有倍数。最后P[] = 0的下标即为素数,该方法用空间换时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#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的下标就是素数。
代码很短,很简单。和普通的通过判断素数来筛选的方法就是用空间换取了时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值