埃式筛法+欧拉筛法

2023-11-07 08:32
文章标签 欧拉 筛法 埃式

本文主要是介绍埃式筛法+欧拉筛法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

浅谈筛法

  • 试除法
    • 埃式筛法
    • 输出 100 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
      • 欧拉筛法

埃式筛法与欧拉筛法的目的是一样的,都是将一段区间内合数删除,最后留下质数,不一样的是思想不同,效率不同,埃式是O(nloglogn)级别的,我也不懂,看网上的,欧拉筛法是线性的O(n)的,下面是找素数的几种方法

试除法

对于量级很小的几个数,直接对该数判断是不是素数就行了,代码如下:

bool check(int a,int b)
{for(int i=a;i<b;i++){for(int j=2;j<i;j++){if(i%j==0) return false; }}return true;}

埃式筛法

先见代码吧

bool num[50050];
int prime[50050];
void check(int x)
{for(int i=2;i*i<=x;i++){if(num[i]){for(int j=i*i;j<=x;j+=i){ // 或写成for(int j=i+i;j<=x;j+=i),两种方法都可,不过第一种更省事 num[j]=false;}}}  
// 先用小于等于sqrt(x)的数对num【】数组操作完之后,以num【】数组为判别依据,把素数全放到素数数组; int k=0;for(int i=2;i<=x;i++){if(num[i]) prime[k++]=i;}
}
 如果是i=2 num【4,6,8,10,12,14,16.。。】=false
       i=3 num[9,12,15,18...]=false
       i=5 num[25,30,35...]=false 
      是把sqrt(x)里的素数全筛出来,以该素数与各项【eg:i=2就有4,6,8,10,12,14   i=3就有9,12,15,18】往后迭代的积为合数,依次筛掉合数,以num【i】的真假为判别标准  
int main()
{memset(num,true,sizeof(num));int n;cin>>n;	check(n);for(int i=0;i<k;i++){cout<<prime[i]<<" ";}
}	

输出
100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

Process exited after 2.439 seconds with return value 0

欧拉筛法

写的注释比较多,这里就不废话了

bool num[50050];
int prime[50050];
int a,b;
int countnum=1;
//素数打表用欧拉筛法   不全以num【i】的真假为依据判别素数还是合数 ,重点在打表操作 
void check()
{for(int i=2;i<=sqrt(b);i++){if(num[i])prime[countnum++]=i;for(int j=1;j<countnum;j++){  if(i*prime[j]>sqrt(b)) break;num[i*prime[j]]=false;    if(i%prime[j]==0) break;}}
}  
// 先依次将小于等于sqrt(x)的素数放到素数数组(因为后面的打表操作只需要这些数),大于它的素数先不放(注意:这一点与埃式筛法不同) 
void ansprint(int x)
{cout<<x<<"=";
// 进去的时候既有素数也有合数,合数的话eg:10=2*5  , 12=2*2*3;这样打表做除法 for(int i=1;i<countnum;){if(x==1) break;else if(x%prime[i]==0){x/=prime[i];cout<<prime[i];if(x!=1) cout<<"*";}else if(i==countnum-1 && x!=1){cout<<x;x=1;	} else i++;}cout<<endl; 
}
int main()
{memset(num,true,sizeof(num));cin>>a>>b;check();   //离线打表 for(int i=a;i<=b;i++){ansprint(i);}
}

输出
2 10
2=2
3=3
4=2*“2
5=5
6=2*”3
7=7
8=2*“2*“2
9=3*”3
10=2*5


Process exited after 2.654 seconds with return value 0
学会的话可以做题练练手,下面是链接
链接: 点这里牛客寒假集训2021.

这篇关于埃式筛法+欧拉筛法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/362445

相关文章

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

欧拉系统 kernel 升级、降级

系统版本  cat  /etc/os-release  NAME="openEuler"VERSION="22.03 (LTS-SP1)"ID="openEuler"VERSION_ID="22.03"PRETTY_NAME="openEuler 22.03 (LTS-SP1)"ANSI_COLOR="0;31" 系统初始 kernel 版本 5.10.0-136.12.0.

nyoj99(并查集+欧拉路+dfs)

单词拼接 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串。 前一个单词的结尾应该与下一个单词的道字母相同。 如 aloha dog arachnid gopher tiger rat   可以拼接成:aloha.arachnid.dog.gopher.rat.tiger 输入 第一行是一个整

nyoj42(并查集解决欧拉回路)

一笔画问题 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。 规定,所有的边都只能画一次,不能重复画。   输入 第一行只有一个正整数N(N<=10)表示测试数据的组数。 每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<

UVa 10820 Send a Table (Farey数列欧拉函数求和)

这里先说一下欧拉函数的求法 先说一下筛选素数的方法 void Get_Prime(){ /*筛选素数法*/for(int i = 0; i < N; i++) vis[i] = 1;vis[0] = vis[1] = 0;for(int i = 2; i * i < N; i++)if(vis[i]){for(int j = i * i; j < N; j += i)vis[j] =

JD 1027:欧拉回路

OJ题目:click here~~ 题目分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径。若该路径是一个圈,则称为欧拉(Euler)回路。 具有欧拉路径的图称为欧拉图(简称E图)。 无向图存在欧拉回路的充要条件: 一个无向图存在欧拉回路,当且仅当该图拥有奇数度数的顶点的个数为0且该图是连通图。 有向图存在欧拉回路的充要条件: 一

欧拉数据库的搭建及其部署

数据库的搭建 进行数据库安装前,必须保证软件yum仓库搭建完成 使用命令 dnf install mariadb-server,发现冲突selinux-policy-targeted-35.5-21.oe2203sp3.noarch有问题 [root@localhost yum.repos.d]# dnf install mariadb-server [root@localhost yu

欧拉下搭建第三方软件仓库—docker

1.创建新的文件内容 切换目录到etc底下的yum.repos.d目录,创建docker-ce.repo文件 [root@localhost yum.repos.d]# cd /etc/yum.repos.d/ [root@localhost yum.repos.d]# vim docker-ce.repo 编辑文件,使用阿里源镜像源,镜像源在编辑中需要单独复制 https://mirr

【UVa】 10735 Euler Circuit 混合图的欧拉回路 最大流

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1676 题目要求:求混合图的欧拉回路+输出路径。 题目分析: 先看一段比较流行的说法吧~: -----------------------------------------

【HDU】5321 Beautiful Set【枚举k求贡献,欧拉函数应用】

传送门: 【HDU】5321 Beautiful Set my  code: my~~code: #include <stdio.h>#include <string.h>#include <vector>#include <algorithm>using namespace std ;typedef long long LL ;#define clr( a , x ) memset