求1,2,\cdots,N1,2,⋯,N 中素数的个数。

输入输出格式

输入格式:

1 个整数N。

输出格式:

1 个整数,表示素数的个数。

输入输出样例

输入样例#1: 复制

10

输出样例#1: 复制

4

说明

• 对于40% 的数据,1 \N \10^6

• 对于80% 的数据,1 \lN \10^7

• 对于100% 的数据,1 \N \10^8

当看到这道题的时候,我直接写下了逐个取余判断的代码,然而看到数据范围的时候我就慌了。。。

当时由于没学过关于素数筛选的算法,很显然除了打表我什么也干不了。。。

好吧,不废话了,直接步入正题:

由于这道题的数据范围较大,因此枚举肯定是行不通的,就算是使用正常筛法,面对10的八次方的数据也是显得十分的吃力,由此,我们要引入欧拉筛法(这里先介绍一下朴素筛法):

由于任何合数都可以拆分成若干素数的乘积,因此每当我们找到一个素数的时候,就可以将部分合数筛选出来,那么我们就解决的部分的问题。

并且讲到这里有一个隐含条件:就是没有被筛选出来的数就是素数(这个可以简化代码长度,也是理解这道题的关键),至于证明,我们可以用反证法:如果它不是素数,那么它一定是合数,而合数又可以拆分成两个素数的乘积,那么在找到它的因子的时候就一定会将其筛选出来。 证完

强忍着没有在证明的时候说显然。。。

但是,可能大家在证明的时候会发现一个问题:就是一个合数一次拆分时的素数因子可能不止一个,那么不就重复计算了吗?

因此我们要优化!!!(由此诞生了欧拉筛法)

由于下面讲解问题,我们先看代码:

1 #include

2 #include

3 int prime[100000005];4 bool vis[100000005];5 int Prime(intn)6 {7 int ans=0;8 for(int i=2; i<=n; i++)9 {10 if(!vis[i])11 prime[ans++]=i;12 for(int j=0; j

其实也很好理解:由于合数可以拆分成不同素数*k(k∈Z),那么当我们筛选时只要筛选出最小素数因子即可,比如12

12=4*3=6*2 很显然,我们需要的就是用素数2来筛选掉12,那么怎么实现呢?

其实这其中有一个规律:由于i是由小到大枚举的,并且数组中的素数也是由小到大枚举的,那么显然我们会先看到4*3,又因为4在和素数2筛掉8时发现竟然能被整除,并且接下来的4*3是没有意义的计算,那么每当i%素数==0是跳出即可。

如果你要问我具体该如何证明那我可以简单说一下:

由于p[j]*k(k∈Z)=i,那么a[j+1]*i=a[j]*k*a[j+1],所以a[j]乘以某个数一定在将来会把这个合数筛掉,由于a[j]比a[j+1]小,那么a[j]才可能是最小素数因子。

好的,我讲完了(好长啊qwq)

MySQL数素数_素数个数-欧拉筛法相关推荐

  1. 素数计算之埃氏筛法、欧拉筛法

    埃氏筛法 int main() {const int maxNumber=200;int isPrime[maxNumber];int i;int x;for (i=0;i<maxNumber; ...

  2. 快速求素数表——埃氏筛法与欧拉筛法

    快速求素数表--埃氏筛法与欧拉筛法 快速求素数表埃氏筛法与欧拉筛法 埃氏筛法 埃氏筛法原理 埃氏筛法时间复杂度 埃氏筛法代码求出1000000以内的素数并且输出n个素数 欧拉筛法 欧拉筛法原理 欧拉筛 ...

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

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

  4. UVA12039 Goldbach‘s Cardinality【欧拉筛法】

    Goldbach's cardinality (GC) of an even number means the number of ways the even number can be expres ...

  5. 埃拉托色尼筛法和欧拉筛法

    筛法 筛法的基本思想是:把从1开始的.某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉.剩下的数中最小的数是素数,然后去掉它的倍数.依次类推,直到筛子为空时结束. 比如,要产生[2,n] ...

  6. UVA11876 N + NOD (N)【欧拉筛法+前缀和】

    Consider an integer sequence N where, N0 = 1 Ni = Ni−1 + NOD(Ni−1) for i > 0     Here, NOD(x) = n ...

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

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

  8. 欧拉筛法(线性筛)的学习理解

    前言 在刚接触编程语言时,对于寻找素数,第一时间想到的便是二重循环暴力查找,其复杂度O(n^2),通过循环中只判断到根号n可以优化一些,不过复杂度也达不到预期.在数论的学习中,我学到了埃氏筛法,O(n ...

  9. 质数c语言欧拉筛选,Python|欧拉筛法求质数

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 我们知道第一个质数是 2.第二个质数是 3.第三个质 ...

  10. UVA516 POJ1365 LA5533 ZOJ1261 Prime Land【欧拉筛法】

    Everybody in the Prime Land is using a prime base number system. In this system, each positive integ ...

最新文章

  1. 希尔伯特著名的第六问题 – 原来麦克斯韦早就有解?
  2. 屏蔽storm ui的kill功能
  3. 《压缩感知理论及其研究进展》读书笔记
  4. python config配置文件的读写--configparser
  5. matlab数学实验课件4,数学实验4_数学实验_doc_大学课件预览_高等教育资讯网
  6. 博客堂怎么连个搜索功能都没有
  7. WinCE的I2C驱动程序设计
  8. 作者:李廉(1951-),男,合肥工业大学计算机与信息学院教授
  9. MySQL GTID复制Slave跳过错误事务Id以及复制排错问题总结
  10. 视觉SLAM笔记(55) 位姿图
  11. 算法导论 练习9.3-8两个有序数组的中位数
  12. mysql swarm_【Docker】 Swarm简单介绍
  13. 数组、字符串长度的计算(转)
  14. 域名被hold了怎么办?
  15. detectron2 c++ 部署笔记
  16. Linux学习-redis主从架构
  17. 追风人拍到壮观龙卷风
  18. 判断字符串是否为回文串
  19. 三维pcd地图转二维栅格地图
  20. 浅谈运营商线路-----TDM、SDH、MSTP,OTN

热门文章

  1. 字节跳动实习生转正工资_字节跳动西瓜视频招聘 | 新媒体运营实习生
  2. 软件开发职业发展路径
  3. SPSS进行问卷数据的效度分析及结果解读(问卷数据统计分析第3步(转载)
  4. 2019年末,10 位院士对 AI 的深度把脉(下)
  5. 电脑“减负”必备,分享一款优秀的重复文件查找工具
  6. window10 删除桌面删除不掉的ie图标(快捷方式)
  7. 51单片机蜂鸣器实验
  8. 走出校门,工作4个月的工作感想
  9. 802.11协议总结
  10. 还在为带货出行发愁吗?你想要的答案或许可以在电梯间找到