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

天天见闻 天天见闻 2022-02-18 科技 阅读: 3840
摘要: 问题:现给定一个大于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

小于_sinx小于x小于tanx_5小于几小于6

算法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

5小于几小于6_小于_sinx小于x小于tanx

算法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

其他相关

作者: 访客 时间:1970-01-01 阅读: 1
...

电脑使用时间长出现反应慢卡顿怎么办

作者: 天天见闻 时间:2022-02-21 阅读: 2144
最近小编在使用自己电脑的时候,发现经常性出现文件打开缓慢,复制拷贝文件所花时间比以前长,并且偶尔还会出现电脑死机,因为小编电脑需要经常处理各种重要的公司文件数据,于是向领导申请更换新机,并将数据全部拷贝到新电脑里。那么电脑变慢变卡怎么解决?...

电子烟和烟哪个危害大 (电子烟比真烟更致癌么真正原因是什么)

作者: 天天见闻 时间:2022-02-26 阅读: 711
电子烟这种新产品应运而生,它号称无味无害,不会成瘾,一下子就抓住了无数老烟民的心,同时也吸引了许多想吸烟又不敢、犹豫彷徨的人,一下子就成了时兴的热门产品。想知道电子烟有害还是无害,最简单的办法就是查看它的成分。由此可以看出,电子烟并不是如商家所说的“无害”,它同样含有对身体危害极大的有害物质,同样能够引发气道慢性炎症、降低肺功能、甚至诱发口腔癌症。...

2019年出生的今年多大 属猪2022年运势怎么样

作者: 天天见闻 时间:2022-02-27 阅读: 689
世界上往往就是很奇妙的,不管是人物性格,还是在未来发展,都不一样的,在12生肖中,每个生肖带来的性格人物,特点运势都是不一样的,就比如属猪的人,在人们的印象中,就是老实憨厚,稳定的人,具体是不是这样,还是需要通过自己的相处才知道,今天我们主要分析的是2022年属猪人的运势。2019年出生的在今年有多大?...

2022春运收官 客流同比增长超20%

作者: 天天见闻 时间:2022-02-27 阅读: 748
2月25日,历时40天的2022年春运正式落下帷幕。交通运输部数据显示,2022年春运总体运行平稳有序,全国预计发送旅客10.5亿人次,比2021年同比增长20.7%。数亿人次的人口流动,织牢疫情防控网络成为今年春运的重中之重。数据显示,自1月21日冬奥运输启动以来至春运结束,铁路部门共开行冬奥列车1205列,其中开闭幕式专列9列。数据显示,今年春运民航共运输旅客3982万人,日均运输旅客99.6万人,比2021年春运同期增长12.5%。...

印花税怎么核算

作者: 天天见闻 时间:2022-02-27 阅读: 642
印花税是以经济活动和经济交往中,书立、领受应税凭证的行为为征税对象征收的一种税。印花税因其采用在应税凭证上粘贴印花税票的方法缴纳税款而得名,属于行为税。凡分程结算运费的,应以分程的运费作为计税依据,分别由办理运费结算的各方缴纳印花税。...
我来说两句

年度爆文