质数相关算法:统计小于整数n的质数个数

天天见闻 天天见闻 2022-02-18 财经 阅读: 3842
摘要: 问题:现给定一个大于1的整数 N,求出小于N 的质数的个数。以下介绍5种算法,前3种思路一致,主要是效率的差异;因此,我们可以采用遍历小于这个数的所有质数来确认这个数是不是质数。if n 120,停止筛选,剩余数即为质数。这个代码写法非常巧妙,先用列表is_right ,存放n个True,代表小于n的所有数我们先看成质数小于,过程中判断为质数倍数的,用is_right[i],巧用下标改为Fasle

问题:现给定一个大于1的整数 N,求出小于N 的质数的个数。

例如:

输入 10

输出:4(2,3,5,7)

输入:20

输出: 8(2,3,5,7,11,13,17,19)

以下介绍5种算法,前3种思路一致,主要是效率的差异;

第5种采用了埃拉托斯特尼筛法进行计算(比较巧妙)

算法1:

针对小于N的每个正整数x,我们可以遍历从2到x-1遍历去试除,当出现一个数能被整除,那这个数就不是质数;当然这种方法也是最容易想到的方法,但效率也是最低的方法;

代码如下:

def prime(n):
    m = 0
    for i in range(2, n):
        j = 2
        for j in range(2, i-1):
            if i % j == 0:
                break
        else:
            m += 1
    return m

算法2:

我们可以遍历从2到x/2的数去试除,这样子相对于第一种方法节省了近一半的时间;

代码如下:

def prime(n):
    m = 0
    for i in range(2, n):
        j = 2
        for j in range(2, int(i/2)+1):
            if i % j == 0:
                break
        else:
            m += 1
    return m

算法3:

我们可以针对第二种算法进一步优化,遍历从2到√x;

因为数学的因数都是成对出现的,如果出现一个大于√x的因数,必然有一个小于√x的因数存在,因此我们遍历到√x就可以判定一个数是不是质数;

例如:16,   1*162*84*4

代码如下:

def prime(n):
    m = 0
    for i in range(2, n):
        j = 2
        for j in range(2, int(i**0.5)+1):
            if i % j == 0:
                break
        else:
            m += 1
    return m

算法4:

对于任意一个大于3的合数(除了1和自身外,还能被其他整数整除的数),我们都可以将其拆分成至少包含一个质数的因子相乘;

例如:8=2 x 4(2是质数),9=3 x 3;

因此,我们可以采用遍历小于这个数的所有质数来确认这个数是不是质数。

代码如下:

def prime(n):
    if n <= 2:
        return 0
    else:
        prime_list = list()
        prime_list.append(2)  # 先将2加入到要遍历的列表中
        for x in range(3, n):
            y = False  
            for y in prime_list:
                if x % y == 0: # 对小于n的x进行遍历,当某个数整除为0时,不执行添加列表操作
                    y = False
                    break
                else:
                    y = True
            if y is True:
                prime_list.append(x)  # 对小于x的质数进行遍历后,没有能整除的质数,则这个数也是质数
        return len(prime_list)

算法5: 埃拉托斯特尼筛法:

从2开始,将每个素数的各个倍数,标记成合数。一个素数的各个倍数,是一个差为此素数本身的等差数列。此为这个筛法和试除法不同的关键之处,前者是先找出所有合数,最后再剔除掉这些合数小于,得到所有素数。后者是逐一尝试每个待测数能否被大于2且小于它的整数整除,直接判断是否为素数。(摘自维基百科)

具体的实现方式:

先留下第一个素数2,将所有2的倍数的合数全部剔除;下一个素数3,将3的倍数的所有合数全部剔除;接着用5进行筛选剔除;当所要使用的素数的平方大于设定值时,停止筛选,则剩下的所有数均为素数。

例如:求出小于120的所有素数,依次使用2,3,5,7进行筛选,当到11时,11*11>120,停止筛选,剩余数即为质数。

这个代码写法非常巧妙,先用列表is_right ,存放n个True,代表小于n的所有数我们先看成质数小于,过程中判断为质数倍数的(也就是合数),用is_right[i],巧用下标改为Fasle

def prime(n):
    if n <= 2:
        return 0
    is_right = [True] * n
    is_right[1] = False
    for i in range(2, int(n ** 0.5) + 1):
        if is_right[i]:
            for j in range(i * i, n, i):
                is_right[j] = False
    m = 0
    for x in range(2, n):
        if is_right[x]:
            m += 1
    return m

其他相关
魔童降世是动漫还是动画

魔童降世是动漫还是动画

作者: 天天见闻 时间:2022-02-21 阅读: 2034
&&& 不算是巅峰,但绝对是顶尖,不算是崛起,国漫已经日渐强大,算是快速发展阶段上的一个里程碑.动漫国产动画片7个字 - 大家最喜欢的国产动画片是什么?&&& IMAX3D哪吒之魔童降世#开画首周末收获IMAX票房预计5400万人民币,创下动画电影在IMAX中国影院的最佳首周末票房纪录、IMAX中国7月最佳三日首周末的佳绩,IMAX首周末票房占比高达8% .有2d,也有3d的!《哪吒之魔童降世》会不会把中国动画重新带上曾经的巅峰?...
一夜三消息!西蒙斯接近复出;开拓者完成三笔交易;格林将复出

一夜三消息!西蒙斯接近复出;开拓者完成三笔交易;格林将复出

作者: 天天见闻 时间:2022-02-24 阅读: 543
根据记者Ramona Shelburne的报道,他被告知本-西蒙斯将提升训练量,看看本周末时状态如何。“西蒙斯接近复出了,他距离复出很可能还有几周的时间,而不是几个月。”西蒙斯本赛季还没有出战过。毫无疑问对于篮网而言这是一个非常好的消息。根据报道,消息人士透露,开拓者将裁掉丹尼斯-史密斯。因为手肘伤势格林,史密斯将缺席多周。而且根据NBA消息人士透露,格林将会在最近几周内复出,对于勇士而言无疑是巨大的好消息。...
要升二级巡视员须先升一级调研员,为升一调却免正处实职值不值?

要升二级巡视员须先升一级调研员,为升一调却免正处实职值不值?

作者: 天天见闻 时间:2022-02-24 阅读: 812
最近,有读者在我的文章后留言问:对我们省直机关的老处长来说,二级巡视员只能从一级调研员中产生,而晋升一级调研员后又得免去处长实职,还得接受以前的下属的领导,没有了独立的办公室,不知晋升一级调研员值不值?最好的选择,无疑是晋升一级调研员后继续担任处长,这其实也是中央文件所允许的。...
你们觉得会拉二胡的人土吗?

你们觉得会拉二胡的人土吗?

作者: 天天见闻 时间:2022-02-26 阅读: 727
二胡已经陪伴了我二十年有余,她给我带来的成长和惊喜也是从未止步的。等到了学会在意别人眼光的年龄,对二胡的看法开始慢慢被外界左右。...
购销合同缴纳印花税的计税依据

购销合同缴纳印花税的计税依据

作者: 天天见闻 时间:2022-02-27 阅读: 569
我们在签订购销合同的时候会发现,有时会注明含税金额不含税金额,有时候则只记载价税合计金额。如果合同要缴纳印花税印花税的计税依据怎么算,我们要按照哪个金额计算缴纳印花税呢?下文将为大家解答疑惑。...
你知道吗?汤加原住民最早来自中国,它也曾是海洋帝国

你知道吗?汤加原住民最早来自中国,它也曾是海洋帝国

作者: 天天见闻 时间:2022-02-28 阅读: 504
汤加的海底火山大喷发,让全世界的目光都聚焦在这个南太平洋岛国上。大多数人其实对这个国家所知甚少,除了在国际新闻中,它常常位列那些由于海平面上升而面临淹没危机的南太平国家之中。在这些新闻之外,汤加实际上岛屿众多,领海广大,拥有别具特色的文化和堪称辉煌的历史。汤加位于国际日期变更线以西,也是每天早晨第一个体验新一天的国家。这些居民便是汤加的原住民。...
我来说两句

年度爆文