Day5:计数质数(埃拉托色尼筛选法)
leetcode地址:https://leetcode-cn.com/problems/count-primes/
Day5:计数质数
一. 问题背景:
统计所有小于非负整数 n 的质数的数量。
二. 解决思路:
埃拉托色尼筛选法:
先将(2,N)的各数放入表中,然后在 2 的上面画一个圆圈,然后划去 2 的其他倍数;第一个既未画圈又没有被划去的数是 3,将它画圈,再划去 3 的其他倍数;现在既未画圈又没有被划去的第一个数是 5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于N的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于 N 的素数。
转换为代码就是如果需要求<n的所有质数个数,则创建一个长度为n的整数数组,所有元素值变为1,1表示对应的索引值为质数,0表示对应的索引值为非质数。从2开始遍历,如果当前数字值为1,则获取其所有倍数,将元素值变为0(标记为非质数)。遍历完成后再次遍历数组,从2开始,记录元素为1的个数,即为对应的质数个数。
三. 算法实现:
#原方法
import numpy as npdef eratosthenes(n):p = np.ones(n, dtype=np.int8)for i in range(2, int(n**0.5 + 1)):if(p[i] == 1):p[i*i::i] = 0return p[2:].sum()result = eratosthenes(25)
print(result)#改进版,直接删去全部偶数
import numpy as npdef eratosthenes(n):if n < 3:return 0n = n >> 1p = np.ones(n, dtype=np.int8)i, j = 1, 3 #i表示位置,j表示位置实际代表的数,j=i*2+1while i < n**0.5:if p[i]:p[j**2 >> 1::j] = 0i, j = i + 1, j + 2 return p.sum()result = eratosthenes(25)
print(result)#不借助numpy,使用列表的方法
def countPrimes(n):if n < 3:return 0 else:# 首先生成了一个全部为1的列表output = [1] * n# 因为0和1不是质数,所以列表的前两个位置赋值为0output[0],output[1] = 0,0# 此时从index = 2开始遍历,output[2]==1,即表明第一个质数为2,然后将2的倍数对应的索引# 全部赋值为0. 此时output[3] == 1,即表明下一个质数为3,同样划去3的倍数.以此类推.for i in range(2,int(n**0.5)+1): if output[i] == 1:output[i*i:n:i] = [0] * len(output[i*i:n:i])# 最后output中的数字1表明该位置上的索引数为质数,然后求和即可.return sum(output)result = countPrimes(25)
print(result)
Day5:计数质数(埃拉托色尼筛选法)相关推荐
- 埃拉托色尼筛选法------筛选质数
前戏:本篇介绍一种特定数据范围内统计该段数据内所有质数的高效算法,埃拉托色尼筛选法. 正文: 1.埃拉托色尼筛选法: 埃拉托色尼筛选法(the Sieve of Eratosthenes)简称埃氏筛法 ...
- c语言埃拉托色尼筛选法数组,埃拉托色尼筛选法 算法
埃拉托色尼筛选法 埃拉托色尼选筛法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthenes 274B.C.-194B.C.)提出的一种筛选 ...
- 埃拉托色尼筛选法 C++实现
在公元前3世纪,古希腊天文学家埃拉托色尼发现了一种找出不大于n的所有自然数中的素数的算法,即埃拉托色尼筛选法. 具体筛选步骤: 这种算法首先需要按顺序写出2到n中所有的数. 然后把第一个元素画圈,表示 ...
- [编程] 2 python 实现埃拉托色尼筛选法
1.1简介: 埃拉托色尼筛选法是用来生成质数的经典计算机编程算法,一般用来衡量计算机的速度. 我们知道,质数是能被自己和1整除的整数. 2,3,5,7,11都是质数. 那么算法是如何实现质数的识别呢? ...
- 埃拉托色尼筛选法计算素数个数
埃拉托色尼筛选法计算素数个数 素数:指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. int main() {int MAXNUM = 1000; // 在这里以1000为例int n ...
- Java 埃拉托色尼筛选法
埃拉托色尼筛选法 埃拉托色尼筛选法 概念 步骤 优化 代码 埃拉托色尼筛选法 概念 埃拉托色尼筛选法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼提出的一 ...
- python filter求素数-埃拉托色尼筛选法
质数:只可以被两个数整除,1和该数本身: 埃拉托色尼筛选法说明; (1)先把1删除(现今数学界1既不是质数也不是合数) (2)读取队列中当前最小的数2,然后把2的倍数删去 (3)读取队列中当前最小的数 ...
- Java实现埃拉托色尼筛选法
1 问题描述 Compute the Greatest Common Divisor of Two Integers using Sieve of Eratosthenes. 翻译:使用埃拉托色尼筛选 ...
- python算法设计 - 埃拉托色尼筛选法
python算法设计源码:https://github.com/MakerChen66/Python3Algorithm 版权声明:原创不易,本文禁止抄袭.转载,侵权必究! 目录 一.埃拉托色尼筛选法 ...
最新文章
- mysql int 做排序_Mysql数据库按照varchar字符串类型排序和按照int整型类型排序的区别和注意点及解决方案...
- 改变2020年及未来的8大人工智能趋势
- postgresql中DML操作
- matlab手写遗传算法解决一元函数最值问题(实例)
- 七十六、Python | Leetcode二分查找和分治算法系列
- [BZOJ4815][CQOI2017]小Q的表格 数论+分块
- 程序猿 - 超实用的工具、素材、学习网站分享
- 【浏览器】浏览器下载CSV文件的方法
- 信奥中的数学:前缀和与差分、大整数开方技巧
- 百度Q2扭亏为盈 李彦宏发信勉励:变革带来阵痛 但能走得更稳更远
- linuxweb服务器域名网站,linux web服务器目录
- 推荐系统与GNN擦出的火花竟如此绚丽多彩
- ssh配置公钥_CentOS配置SSH免密登陆
- getAttribute实例例java,Java AttributedCharacterIterator.getAttribute方法代码示例
- Linux软链接的创建,删除,修改
- 用最火的python实现最常用、最靓、最实用图表~~
- 周爱民:详解架构的核心原则
- win10 C盘右边是OEM分区扩容的解决办法
- 三星Q950T全景声回音壁测试心得
- 计算机中的二进制实验报告,大学计算机-实验报告一.doc