首页 > 其他分享 >浅谈筛法——埃氏筛

浅谈筛法——埃氏筛

时间:2023-10-29 17:44:50浏览次数:41  
标签:10 埃氏 浅谈 筛法 int 质数 标为 vis 不是

前置芝士:

浅谈筛法——普通筛

例·1 素数个数

运用上一篇的知识,可得出以下代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e8+5;
int n,ans;
bool prime(int x){
	if(x==1){
		return 0;
	}
	if(x==2){
		return 1;
	}
	for(int i=2;i*i<=x;i++){
		if(x%i==0){
			return 0;
		}
	}
	return 1;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		if(prime(i)){
			ans++;
		}
	}
	cout<<ans<<endl;
	return 0;
}

但,当我们把这串代码提交的时候……

所以,我们要吸氧优化

主角——埃氏筛:

为什么叫埃氏筛我不知道,应该是一个姓埃的人发明的,但,原理我是懂的

埃筛的思路:

对于每一个数,如果他是质数,则将它的倍数标为不是质数。

看着很含糊,仔细讲一下:

设现在有\(1-10\)十个数

\(1\ 2\ 3\ 4\ 5\ 6\ 7\ 8\ 9\ 10\)

首先,1不是质数

\(1\ 2\ 3\ 4\ 5\ 6\ 7\ 8\ 9\ 10\)

\(n\ y\ y\ y\ y\ y\ y\ y\ y\ y\)

下一个,2现在是质数,将2的倍数标为不是质数

\(1\ 2\ 3\ 4\ 5\ 6\ 7\ 8\ 9\ 10\)

\(n\ y\ y\ n\ y\ n\ y\ n\ y\ n\)

下一个,3现在是质数,将3的倍数标为不是质数

\(1\ 2\ 3\ 4\ 5\ 6\ 7\ 8\ 9\ 10\)

\(n\ y\ y\ n\ y\ n\ y\ n\ n\ n\)

下一个,4现在不是质数,跳过

下一个,5现在是质数,将5的倍数标为不是质数

\(1\ 2\ 3\ 4\ 5\ 6\ 7\ 8\ 9\ 10\)

\(n\ y\ y\ n\ y\ n\ y\ n\ n\ n\)

下一个,6现在不是质数,跳过

下一个,7现在是质数,将7的倍数标为不是质数

\(1\ 2\ 3\ 4\ 5\ 6\ 7\ 8\ 9\ 10\)

\(n\ y\ y\ n\ y\ n\ y\ n\ n\ n\)

下一个,8现在不是质数,跳过

下一个,9现在不是质数,跳过

下一个,10现在不是质数,跳过

下一个,11超出边界,结束

-----------------------------------------------华丽的分割线-----------------------------------------------

经过刚才的捣鼓,我们可以理解埃筛了

code:

void Prime(){
	vis[0]=1;//0不是质数 
	vis[1]=1;//1不是质数 
	for(int i=2;i<=maxn;i++){//筛出2~maxn的所有质数 
		if(vis[i]==0){//之前没被标记过 
			for(int j=i+i;j<=maxn;j+=i){//从i+i开始,将i的倍数标记为不是质数 
				vis[j]=1;//标记 
			}
		}
	}
}

如何判断一个数是不是质数

很简单,如果vis[i]==0,那么是质数,否则不是质数

例·1代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e8;
int n,sum;
bool vis[maxn];
void Prime(){
	vis[0]=1;//0不是质数 
	vis[1]=1;//1不是质数 
	for(int i=2;i<=maxn;i++){//筛出2~maxn的所有质数 
		if(vis[i]==0){//之前没被标记过 
			for(int j=i+i;j<=maxn;j+=i){//从i+i开始,将i的倍数标记为不是质数 
				vis[j]=1;//标记 
			}
		}
	}
}
int main(){
	Prime();//调用函数 
	sum=0;//清空 
	cin>>n;//输入 
	for(int i=1;i<=n;i++){//枚举 
		if(vis[i]==0){//是质数 
			sum++;//数量++ 
		}
	}
	cout<<sum;//输出 
	return 0;
}

练习题:

P3383 【模板】线性筛素数

P1865 A % B Problem

标签:10,埃氏,浅谈,筛法,int,质数,标为,vis,不是
From: https://www.cnblogs.com/OIer-QAQ/p/17796099.html

相关文章

  • 浅谈筛法——普通筛
    前置知识-因数和倍数(六年级及以上自行跳过):\(n\divm=k\),我们就说\(n\)是\(m\)和\(k\)的倍数,\(m\)和\(k\)是\(n\)的倍数。简单来说就是这样的:\(\text{被除数}\div\text{除数,余数为0}\),那我们就说除数是被除数的因数,被除数是除数的倍数。前置知识-素数和合数(六年级及以上自......
  • 浅谈UI自动化测试
    随着软件行业的不断发展,建立一个完善的自动化测试体系变得至关重要。目前,自动化测试主要涵盖接口自动化测试和UI自动化测试两个主要领域。就目前而言,企业在UI自动化测试方面的覆盖率仍然相对较低。接口自动化测试可以模拟和执行应用程序接口的各种操作,以验证接口的功能、性能和稳定......
  • 浅谈UI自动化测试
    随着软件行业的不断发展,建立一个完善的自动化测试体系变得至关重要。目前,自动化测试主要涵盖接口自动化测试和UI自动化测试两个主要领域。就目前而言,企业在UI自动化测试方面的覆盖率仍然相对较低。接口自动化测试可以模拟和执行应用程序接口的各种操作,以验证接口的功能、性能和稳......
  • 浅谈城市综合管廊运维的系统集成方案
    安科瑞电气股份有限公司:罗轩志摘要:从网络拓扑结构、开放式实时以太网协议、控制层系统配置方面介绍了综合管廊的系统网络架构设计,分析了无线网络特性,阐述了基于HTML5架构所能实现的功能的初步构想,以便于综合管廊运维人员巡检,确保管廊本体安全。0引言综合管廊的控制部分是保证综合......
  • 浅谈关于羚通智能分析平台通道管理和告警查询的使用功能
    ​上期我们知道了如何使用羚通智能分析平台,今天我们来详细了解一下羚通智能分析平台的通道管理和告警查询的使用功能。因为羚通智能分析平台主要是做视频算法分析的,所以我们今天来看一看羚通智能分析平台的通道管理和告警查询两个部分的使用情况如何。上一期,我们了解了一下......
  • 浅谈动态规划——01背包
    本文暂时不谈记忆化搜索先看例题P1048采药(其实就是个加了题目背景的01背包板子题)我知道你可能不想读题,所以我把题意写在这里了题意你总共有T的时间有n个物品,第i个物品的价值为w[i],拿走它消耗的时间为v[i],且每个物品只能拿一次计算出能拿取的物品的最大总价值我猜你会这......
  • 浅谈排序网络与并行排序算法
    对于普通的基于比较排序我们拥有一个复杂度下界\(O(n\logn)\),然而如果我们允许并行计算的话,将得到一些复杂度更优秀的计算方法。听到并行这个词许多人就会认为你有几个线程复杂度就除以几,所以线程堆得越多越好。但许多的算法问题都必须要满足你必须要算完A才能去计算B,比如对......
  • 浅谈go反射
    基本概念支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。Go语言提供了reflect包来访问程序的反射信息。Refelct解析Refel......
  • 浅谈AI人体姿态识别技术的先进性及安防视频监控应用场景
    随着计算机视觉技术和安防监控技术的不断发展,基于AI算法的人体姿态识别技术也得到了广泛的应用。然而,传统的安防监控系统通常只局限于简单的视频监控等功能,无法准确地识别人体的姿态,使得一些安防监控存在着一定的漏洞和不足之处。基于AI算法的人体姿态识别技术是基于人工智能和计......
  • 浅谈AJAX
    什么是AJAX?AJAX(AsynchronousJavaScriptandXML),中文叫做:异步的JavaScript和XML。这是一种Web交互方法AJAX说白了,就是”服务器和客户端之间是如何交流的?“这是一种“老技术,新用法”。它最早是2005年由"AJAX之父"JesseJamesGarrett提出。AJAX技术的理解实际上,它是由几......