欧拉筛(最优的方法,对于找质数,细节讲解)

简介: 欧拉筛(最优的方法,对于找质数,细节讲解)

前言:最优的找质数方法,欧拉筛,看过无数博主的讲解,许多博主还是没有抓到新手的疑惑点,今天在我自身花费了一天时间不断的证明和思考,总结出来了一篇给新手的最细讲解!!!(建议收藏,不然就找不到了)


欧拉筛



结合代码进行精准解析。


#include<iostream>
using namespace std;
bool a[100001]={1,1};//i=0,i=1的时候都不是质数 ,所以直接标记
int b[100001];//存质数 
int k;  long long n;
int main()
{
  cin>>n;
  for(int i=2;i<=100001;i++)//这个意思是在100001里面找到质数并且标记 ,质数最小是2,所以i=2 
  {
    if (a[i]==0)  b[++k]=i; //如果没有被标记为1,就是质数。我接下来会讲解为什么是质数。 
    for(int j=1;j<=k;j++)// //j小于当前所有的质数的个数
    {
      if(i*b[j]>100001)break;// 如果超出给出的范围,那么就退出循环 
      a[i*b[j]]=1;//用质数数依次×i,结果标记为合数(也就是标记为1)。 
      if(i%b[j]==0)break;//最关键的只标记一次 
    } 
  }
  for(int i=1;i<=n;i++) //你想查询的个数 
  {int m;
    cin>>m;//在100001里面输入你想查询的数
    if(a[m]==0)//如果没有被标记,就是质数,直接输出。 
    {
      cout<<m<<' ';
    }   
  } 
 } 


1.欧拉筛和埃氏筛法的相爱相杀。(通过上面的代码我们进行打表解析)


欧拉筛法的时间是埃氏筛法时间的十分之一甚至更少,为什么呢?

我们顺着源头思考,欧拉筛法和埃氏筛法一样,围绕{素数的倍数不是素数},

那么为什么欧拉筛比埃氏筛法效率快这么多?


欧拉筛法时间复杂度少的原因,就是它不会重复标j记一个数是不是素数的倍数,例如:i = 4 ,j = 1,b[1] = 2,i*b[1]=8;i%b[1]=0,所以退出循环,j那么为什么这里要退出循环呢?如果不跳出循环,b[j+1] = 3,i=4,i*b[j+1]=4 * 3 = 2 * 6 = 12,在i = 6时会计算(此时就会重复标记)。(我打了个表,为了方便你理解)因为欧拉筛法的原理便是通过最小素因子来消除。我们可以打个表观察。欧拉筛运行打印出来的结果

i= 2//当i取2时 
j =1 b[1] = 2 i*b[j] = 4
i =3//当i取3时 
j=1 b[1] = 2 i*b[j] =6
j=2 b[2] = 3 i*b[j] = 9
i=4//当i取4时 
j=1 b[1] = 2 i*b[j] = 8//上面提到为什么退出循环,因为如果不退出循环,就会标记一次12,所以不行
i=5//当i取5时 
j=1 b[1] = 2 i*b[j] = 10
j=2 b[2] = 3  i*b[j ]=15
j=3 b[3] = 5 i*b[j] = 25
i=6//当i取6时 
j=1 b[1] = 2 i*b[j] =12//这里已经标记了12了。
i=7//当i取7时 
j=1 b[1] = 2 i*b[j] = 14
j=2 b[1] = 3 i*b[j] = 21
j=3 b[1] = 5 i*b[j] = 35
j=4 b[1] = 7 i*b[j] = 49

这个时候我们就会发现规律当i为偶数的时候只有标记一个值就是每次都是b[1]=2,b[1]*i=某个数,并且标记,但是当i为奇数的时候,我们则可以在这个过程中把符合的数的标记了,等到遇到这个奇数的最小素因子时,就会退出循环,我们通过这个表可以观察,这里把2,3,5,7,11……的素数的倍数都打印出来并且标记了,在通过        if(i%b[j]==0)break;//最关键的只标记一次 ,这步,只进行一次标记,不会重复标记。


最后,如果还有地方不懂可以私信问我,我是一个热情和蔼的博主。


相关文章
|
SQL 关系型数据库 MySQL
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
1205 0
|
5月前
|
自然语言处理 Rust Java
通义灵码编程智能体深度评测(Qwen3模型+终端操作+MCP工具调用实战)
通义灵码作为阿里云推出的智能编程解决方案,凭借Qwen3模型与MCP平台的协同,在代码生成、终端操作与工具链调用方面展现强大能力。本文从真实开发场景出发,评测其在多语言代码理解、自动化工作流及复杂工程任务中的表现,结合性能与成本数据,揭示其在提升开发效率与系统集成方面的工程价值。
545 1
|
8月前
|
机器学习/深度学习 并行计算 算法
量子计算如何改变优化问题?带你入门量子优化!
量子计算如何改变优化问题?带你入门量子优化!
272 7
|
C#
WPF技术之Visibility
WPF中的Visibility属性用于控制元素在界面上的可见性。
889 1
|
11月前
|
人工智能 自然语言处理 云计算
谁主沉浮:解析中国CRM市场的竞争格局 谁是中国CRM里的第一
在中国企业数字化转型的大潮中,CRM市场日益竞争激烈。销售易凭借深厚的技术积累、自主研发的PaaS平台及AI技术的应用,以及对中国企业需求的深刻理解,在技术创新、产品体系、行业经验和本土化能力等方面展现出显著优势,确立了其在CRM市场的领导地位。面对纷享销客、金蝶云之家、明源云等竞争对手,销售易通过持续的技术创新和产品升级,不断巩固并扩大其市场优势。
谁主沉浮:解析中国CRM市场的竞争格局 谁是中国CRM里的第一
|
机器学习/深度学习 数据挖掘 开发工具
2024年最全0基础学python开发工具及学习平台推荐_python平台a,面试阿里巴巴客服
2024年最全0基础学python开发工具及学习平台推荐_python平台a,面试阿里巴巴客服
2024年最全0基础学python开发工具及学习平台推荐_python平台a,面试阿里巴巴客服
|
C# 开发工具 git
ScreenToGif:一款开源免费且好用的录屏转Gif软件
ScreenToGif:一款开源免费且好用的录屏转Gif软件
705 1
|
IDE 开发工具 开发者
PyCharm安装教程(图文结合,超详细,小白安装必看)
PyCharm安装教程(图文结合,超详细,小白安装必看)
|
C语言 C++ Python
在 Cython 中声明结构体、共同体、枚举
在 Cython 中声明结构体、共同体、枚举
226 0
|
机器学习/深度学习 算法 数据库
基于深度学习的多人步态识别系统(目前数据集大小124人,准确率96.5%)
基于深度学习的多人步态识别系统(目前数据集大小124人,准确率96.5%)
1720 0
基于深度学习的多人步态识别系统(目前数据集大小124人,准确率96.5%)

热门文章

最新文章