素数筛

转载:https://blog.csdn.net/dy416524/article/details/86431057
枚举所有小于数,看是否它能整除其他自然数,但实际上只需要枚举根号次。

bool Is_prime(int n)
{for(int i=1;i*i<=n;++i){if(n%i==0) return false;}return true;
}

•埃氏筛:做法其实很简单,首先将2到n范围内的整数写下来,其中2是最小的素数。将表中所有的2的倍数划去,表中剩下的最小的数字就是3,他不能被更小的数整除,所以3是素数。再将表中所有的3的倍数划去……以此类推,如果表中剩余的最小的数是m,那么m就是素数。然后将表中所有m的倍数划去,像这样反复操作,就能依次枚举n以内的素数,这样的时间复杂度是O(nloglogn)。

•欧拉筛:欧拉筛法的基本思想 :在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。其他复杂度(O(n)).


#include <iostream>
#include <bits/stdc++.h>
using namespace std;
bool Is_prime(int n)//普通判断素数
{for(int i=1;i*i<=n;++i){if(n%i==0) return false;}return true;
}
#define maxn 10000000
bool vis[maxn];
int prime[maxn],x;
void isprime(int n) //埃氏筛
{for(int i=2;i<=n;i++){if(!vis[i]) prime[x++]=i;for(int j=2;j*i<=n;j++){vis[i*j]=true;}}
}
void oulasai(int n)  //欧拉筛
{for(int i=2;i<=n;i++){if(!vis[i]) prime[x++]=i;for(int j=0;j<x;j++){if(i*prime[j]>n) break;vis[i*prime[j]]=true;if(i%prime[j]==0) break;}}
}
int main()
{int n;scanf("%d",&n);oulasai(n);for(int i=0;i<x;i++)printf("%d\n",prime[i]);return 0;
}

欧拉筛的难点就在于对if (i % prime[j] == 0)这步的理解,当i是prime[j]的整数倍时,记 m = i / prime[j],那么 i * prime[j+1] 就可以变为 (m * prime[j+1]) * prime[j],这说明 i * prime[j+1] 是 prime[j] 的整数倍,不需要再进行标记(在之后会被 prime[j] * 某个数 标记),对于 prime[j+2] 及之后的素数同理,直接跳出循环,这样就避免了重复标记。
比如我们求20以内的素数,

2 是 。排除4,2整除2,跳出;

3是。 排除6,3不整除2,继续,排除9,3整除3,跳出。

4不是,但继续执行,排除8,4整除2,跳出。

5是。 排除10,15,25;

6不是。继续执行,排除12,18,30;

可见如果4处不跳出循环,12就会被筛两次。
————————————————
版权声明:本文为CSDN博主「)NCuyALnA$Ke」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dy416524/article/details/86431057

素数筛【埃筛,欧拉筛(线性筛)】相关推荐

  1. 中高级数论 [欧拉函数线性筛,二次剩余]

    欧拉函数线性筛 对于素数ppp, φ(p∗i)={p−1i=1p∗φ(i)p∣i(p−1)∗φ(i)p∤i\varphi (p*i)= \begin{cases} p-1& i=1\\ p*\ ...

  2. 筛质数—(朴素筛法、埃氏筛法、欧拉筛法(线性筛法))

    筛质数时首先要了解质数的定理:1~n中有  个质数 下面再来看具体算法: 1.朴素筛法: 直接把2~n-1中质数和合数的倍数都筛一遍,其代码如下所示: int primes[N],cnt=0; boo ...

  3. AcWing 868. 筛质数(欧拉筛模板)

    题目连接 https://www.acwing.com/problem/content/870/ 思路 欧拉筛模板,学习链接:https://acmer.blog.csdn.net/article/d ...

  4. 素数判定(素数筛法)(欧拉)

    这里主要说一下 素数筛法,该方法可以快速的选取出1~N数字中的所有素数.时间复杂度 远小于O(N*sqrt(N)) 方法为:从2开始,往后所有素数的倍数都不是素数.最后剩下的数都是素数. 再说说欧拉公 ...

  5. 素数筛法(传统普通、朴素筛法、埃式筛法、欧拉筛法(线性筛))

    素数筛法(普通.朴素筛法.埃式筛法.欧拉筛法) 1.题目 2.分析 3.代码 传统普通 朴素筛法 朴素筛法(6.14) 埃式筛法 埃式筛法(6.14) 欧拉筛法(线性筛) 欧拉筛法(线性筛 6.14) ...

  6. 线性筛与欧拉函数、莫比乌斯函数

    网上关于素数筛的资料很多,这里只是给出弱鸟整理的几个线性筛和应用. 最朴素的素数筛--埃拉托斯特尼筛法(Sieve of Eratosthenes) 复杂度 Olognlogn int primes[ ...

  7. UVa-10820 Send a Table 欧拉函数

    题意 交表 由于f(k∗x,k∗y)f ( k*x , k* y ) 可以由f(x,y)f ( x , y )递推出来 让我们求 在x,y都不大于n的情况下 计算最少需要计算多少不同的项 n<= ...

  8. 素数的线性筛法java,埃氏筛 线性筛(欧拉筛) 算法解析

    埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...

  9. 埃氏筛 线性筛(欧拉筛) 算法解析

    埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...

  10. 筛选质数,埃氏筛和欧拉筛(线性筛)

    求len之内的所有的素数 除了比较常用的开根号的求法,还有两种更好的方法,埃氏筛和线性筛.其中埃氏筛更好理解,而线性筛(欧拉筛)不好理解但是更快. 埃氏筛 #include <bits/stdc ...

最新文章

  1. Kafka事务特性详解
  2. 从零开始数据科学与机器学习算法-数据预处理与基准模型-01
  3. kafka _命令行操作
  4. ie内核浏览器_[正式版下载] 微软全新 Chrome 内核 Edge 浏览器!原生支持 Chrome 插件扩展...
  5. android popupwindow 调用方法,Android PopUpWindow使用详解
  6. c语言赋值运算符左边必须是,C语言运算符入门讲解
  7. commit是直接提交到远程吗 svn_xcode 把项目代码提交到远程SVN服务器
  8. netty 支持多种通讯协议
  9. vs2015移植linux编译,windows平台移植(原linux项目)时,用vs2015开发,碰到的问题及处理方案记录...
  10. C语言博客作业08,C语言I博客作业08
  11. ListBox横向绑定数据
  12. Salesforce 主要发展历史
  13. Struts2通配符映射的各种情况详情
  14. python樱花树代码_Python绘图案例:2020年新年画一棵樱花树(源代码)
  15. 介绍java糊涂Hutool工具
  16. leecode第一百七十四题(地下城游戏)
  17. 个人中心(修改密码)
  18. 在爱情里不会委曲求全,活的非常自我,态度十分坚决的三个生肖
  19. 软件推荐:Typora -新手上路-夏凌玥
  20. Vue 使用vue-seo-phantomjs 实现SEO抓取优化方案

热门文章

  1. Kubernetes网络flannel之host-gw模式分析
  2. 2016 PayPal商家账户界面 如何集成支付按钮
  3. Python中过滤列表中全部奇数
  4. 2022-2028年中国铝电解电容器电解液市场调研报告
  5. LeetCode之K sum problem
  6. 计算机英特尔显卡在哪找,英特尔®显卡和 Windows 7 * 常见问题解答
  7. 计算机网络(2.10)物理层- 宽带接入技术-ADSL 技术
  8. Mybatis中利用PageHelp分页功能的实现
  9. 加密解密工具 之 恩尼格玛密码机密码
  10. Linux配置免密码登录(原理 + 实践)