质数筛选(详细解释以及模板)(Eratosthenes)

本文介绍了素数筛法的基本原理及其实现,并针对原始筛法进行了优化,通过限制p为素数并调整内循环起始点,显著提升了算法效率。

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

要求: 筛法构造1-n的素数表

筛法的思想特别简单,对于不超过n的每个非负整数p,删除2p,3p,4p.......,

当处理完所有数之后,还没有被删除的就是素数。如果用p[i]表示i已经被删除,代码可以这样写

<span style="font-size:24px;">const int maxn=10000;
int p[maxn];  //使用质数筛法 
void prime() //没有优化 
{
	memset(p,0,sizeof(p));
	for(int i=1;i<=n;i++)
	  for(int j=2*i;j<=n;j+=i)
	     p[i]=1;
}</span>

以上代码时间复杂度O(nlongn) ,尽管时间复杂度已经很高效了,还是可以改进。

下面这份代码主要用于改进,首先,对于不超过n的每个非负整数p,p可以限定为素数。只需要在第二重循环前加 if(!p[i])即可

另外,内循环也不必从i*2开始--塔已经在i=2被筛选掉了,改进后代码如下。

<span style="font-size:24px;">void prime_1()  //优化。 
{
    memset(p,0,sizeof(p));
    p[1]=1;  //1不是质数 
	int m=sqrt(maxn+0.5);  
	for(int i=2;i<=m;i++)  //1-maxn 质数筛选 
	{
	   if(!p[i])  //如果p[i]=1;表示i以及i的倍数已经被筛选掉了
	   for(int j=i*i;j<=maxn;j+=i)
	       p[j]=1;
	}	
} </span>


互相学习,共同进步,如果觉得有不妥的地方还望指出来,小生刚出道。

如果觉得还可以,可否给小弟第一下,以表示估计,感激不尽。

你的鼓励将是我莫大的前进动力。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值