素数筛——试除法——埃式筛——欧啦筛
先代码奉上:
试除法
#include<iostream>
#include<cmath>
using namespace std;bool isprime(int n)
{if(n<=1) return false;for(int i=2;i<=n/i;i++){if(n%i==0) return false ;else return true;}}int main()
{int n;cin>>n;cout<<isprime(n)<<endl;}
1.判断用 bool类型
2.为了节约时间
1.i<=n;
2.i<=sqrt(n);//记得用上#include <cmath>
3.i<=n/i;//防止溢出
埃式筛
#include <iostream>
using namespace std;
const int N=1e5;
int n;
bool status[N];
int primes[N];
int num=0;
bool get_primes(int n)
{for(int i=2;i<=n;i++){if(!status[i]){primes[num]=i;num++;}for(int j=i*2;j<=n;j=j+i){status[j]=1; //时间复杂度约为o(n*log2n) }}
}
int main()
{cin>>n;get_primes(n);for(int i=0;i<num;i++){cout<<primes[i]<<" ";}return 0;
}
总结归纳:埃式筛运用 是不是2的倍数,3的倍数,4的倍数来筛。。。以此类推。
首先定义一个状态数组(判断它是否为素数,bool类型,建议0为素数,1为合数),定义一个用来装素数的数组(int 类型即可),初始一个num=0 用来判断素数个数,一个整数n。之后写一个bool 类型的函数(用来获取素数数组和素数个数),从2开始即可(n<=1 尚且归为不在考虑范围之类),此时建议0为素数,1为合数起作用了,定义在函数外的数组初始化为0,所以没有判断的数即为素数。因此若直接从i等于2开始,int j=i*2;j<=n;j+=i,的数为大于等于4的合数。把它们改变一下状态即可。最后记得运用函数前,必须先调用该函数,可以看到get_primes(int n)函数并没有输出的值,而是把素数数组和素数个数分别存入了数组和num 中。
欧拉筛
#include <iostream>
using namespace std;
const int N=1e5;
int n;
bool status[N];
int primes[N];
int num=0;
bool get_primes(int n)
{
for(int i=2;i<=n;i++)
{
if(!status[i]){primes[num]=i;
num++;
}
for(int j=0;primes[j]<=n/i;j++)
{ //时间复杂度为0(n)
status[primes[j]*i]=1;
if(i%primes[j]==0) break;
}
}
}
int main()
{
cin>>n;
get_primes(n);
for(int i=0;i<num;i++)
{
cout<<primes[i]<<" ";
}
return 0;
}
#include <iostream>
using namespace std;
const int N=1e5;
int n;
bool status[N];
int primes[N];
int num=0;
bool get_primes(int n)
{for(int i=2;i<=n;i++){if(!status[i]){primes[num]=i;num++;}for(int j=0;primes[j]<=n/i;j++){ //时间复杂度为0(n) status[primes[j]*i]=1;if(i%primes[j]==0) break;} }
}
int main()
{cin>>n;get_primes(n);for(int i=0;i<num;i++){cout<<primes[i]<<" ";}return 0;
}
总结归纳:原理:只用最小质因子来筛
可以发现 欧啦筛与埃式筛只有两行代码的区别,但是欧啦筛却比埃式筛快几个数量级。
注意;用的是最小质因子来筛,为了是最小,我们从0开始枚举,为了是素数,我们从素数数组中挑选它的倍数,注意素数*i=合数(我们要筛的数)。primes[j]<=n/i,其实就是如此。为了不和埃式筛一样重复,我们(i%primes[j]==0) break;跳出即可。
素数筛——试除法——埃式筛——欧啦筛相关推荐
- 【如何求素数】试除法讲解
试除法 1.素数的定义 2.for套嵌使用求解素数 3.试除法的算法优化 1.素数的定义 素数又称为质数,指的是在大于1的整数中 只能被1和这个数本身整除的数. 在了解了素数的定义之后,我们如何用C语 ...
- 线性筛素数(欧拉筛)
欧拉筛是O(n)复杂度的筛素数算法,1秒内埃筛能处理1e6的数据,而1e7的数据就必须用欧拉筛了. 埃筛的基本思想是:素数的倍数一定是合数. 欧拉筛基本思想是:任何数与素数的乘积一定是合数 算法概述: ...
- 埃氏筛与欧拉筛(线性筛)
目录 一.前言 二.埃氏筛与欧拉筛(线性筛) 1.问题描述 2.基本思路 (1)埃氏筛法 (2)欧拉筛法 三.题例 1.上链接 2.简单思路 3.代码 (1)埃氏筛python版 (2)欧拉筛pyth ...
- 欧拉筛(线性筛)超级详解 - Python3实现
# acwing 868. 筛质数 N = 1000010def get_prime():global cntfor i in range(2,n+1):if not st[i]:cnt += 1# ...
- 欧拉筛+埃式筛求素数
参考:https://blog.csdn.net/nk_test/article/details/46242401 先看一下经典的埃拉特斯特尼筛法: 1 int prime[MAXN],vis[MAX ...
- 素数筛法(传统普通、朴素筛法、埃式筛法、欧拉筛法(线性筛))
素数筛法(普通.朴素筛法.埃式筛法.欧拉筛法) 1.题目 2.分析 3.代码 传统普通 朴素筛法 朴素筛法(6.14) 埃式筛法 埃式筛法(6.14) 欧拉筛法(线性筛) 欧拉筛法(线性筛 6.14) ...
- 算法笔记--素数筛(朴素筛,埃式筛,欧拉筛)
素数 素数也叫质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数.如2 , 3 , 5 , 7 , 11等. 素数筛 素数筛即筛选出1~n内的素数的方法,这里介绍三种 常见的求素数 ...
- 素数筛法详解:埃氏筛和欧拉筛
文章目录 摘要 埃式筛 欧拉筛 超级详细的基础算法和数据结构合集: https://blog.csdn.net/GD_ONE/article/details/104061907 摘要 本文主要介绍埃氏 ...
- 素数的线性筛法java,埃氏筛 线性筛(欧拉筛) 算法解析
埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...
最新文章
- NeHe OpenGL第三十五课:播放AVI
- 分支机构L2L *** 到总部再PAT通过专线到合作伙伴(SVTI建立***)
- 【Cf Edu #47 F】Dominant Indices(长链剖分)
- EXE与SYS通信(直接访问模式)
- 说实话,用完Gradle之后,有点嫌弃Maven了。贼好用!
- SonarQube中配置c语言/c++语言代码规则插件
- 找2个数组中相同的数
- 动态阈值_如何设置数据看板(大屏)数据异常报警的动态阈值
- hive数据去重测试
- wireshark的简单使用:在二进制流中还原出zip文件
- Android开发之内容提供者ContentProvider
- iOS创建苹果证书、制作p12证书流程
- 【基于深度学习的人机对弈机器人——视觉识别】
- 1.4 px30驱动移植-网卡驱动找不到网卡解决
- pta构造回文数C语言,【LeetCode】 #9:回文数 C语言
- Axure chrome插件安装
- untiy Input 获取鼠标以及触摸操作
- Yarn Web页面 8088 端口在Windows浏览器无法访问
- 从Python爬虫到Spark预处理数据的真实需求[三]
- 【MATLAB】机器学习:决策树算法实验
热门文章
- 2023 新年倒计时HTML源码
- 值得你关注的Android6.0上的重要变化(一)
- Java开发必须掌握!开源掌机玩java
- 【STC8A8K64S4A12开发板】—开始做 定时器/计数器 实验啦
- 华为maters保时捷鸿蒙,【华为MateRS保时捷版评测】编辑分享:妙用华为Mate RS保时捷之三摄_华为 Mate RS保时捷版_手机评测-中关村在线...
- 卷积神经网络和深度神经网络的区别是什么?
- 卷积神经网络CNN(7)—— 限速交通标志分类
- 阿里巴巴总裁马云语录
- MarkdownPad 2 激活方法与图片上传解决方案
- Camtasia studio编辑、合成视频和音频——自用