栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

质数筛法 常规筛法 埃式筛法 欧拉筛法 Python实现

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

质数筛法 常规筛法 埃式筛法 欧拉筛法 Python实现

目录
    • 常规筛法:
    • 埃式筛法:
    • 欧拉筛法:

前言:博主不是计科专业,可能会有错误,欢迎指正。 这个质数筛法真的十分简单,不要害怕,一口就学了不要拖沓。一开始我认为会很难,不敢学习,后来被逼无奈,学习之后发现你只要鼓起勇气去学习就很简单。 然后看见网上其他博主写的筛法感觉好墨迹啊而且文章半天进入不到重点。然后就想自己写篇文章。

常规筛法:

代码如下:

from math import sqrt
def hanshu(n):
    for i in range(2,int(sqrt(n))+1):
        if n%i==0:
            return False
    return True
print(hanshu(100))

代码输出:

False

注释:这个就没啥要说的了吧。

埃式筛法:

代码如下:

from math import sqrt
def hanshu(n):
    ls,x,y=[True]*(n+1),2,int(sqrt(n))+1
    while x 

代码输出:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

注释:先创造一个含有(n+1)个元素的列表,标记它们全为质数。把下标为 2 的倍数列表元素标记为非质数(1倍除外),把下标为 3 的倍数列表元素标记为非质数(1倍除外),……,把下标为 int(sqrt(n)) 的倍数列表元素标记为非质数(1倍除外)。结束。

欧拉筛法:

代码如下:

from math import sqrt
def hanshu(n):
    ls,x,y=[True]*(n+1),2,int(sqrt(n))+1
    while x 

代码输出:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

注释:你自己想想啊。2的时候已经去掉了2的倍数,4的时候还要去掉4的倍数,这一步是不是很多余。所以欧拉筛法就是在埃式筛法的基础上加一句话 if ls[x]==True:。

后记:好了,OVER,是不是很简单很粗暴。不太喜欢废话连篇。认为有用的话点个赞吧

最后插几句吧,读者不感兴趣的话直接可走。

我在洛谷做过一道题,当时欧拉筛法内存超限(当然也可能是我太菜了,这道题其他的部分算法不好导致内存超限,我也没有具体深究),所以写了个低端一点但是不太占用内存的欧拉筛法。当然,时间也上去了。代码如下:

from math import sqrt
def hanshu1(n):
    for i in range(2,int(sqrt(n))+1):
        if n%i==0:
            return False
    else:
        return True
def hanshu2(n):
    m,ls=3,[2]
    while m<=n:
        for i in ls:
            if m%i==0:
                m+=1
                break
        else:
            if hanshu1(m)==True:
                ls.append(m)
            m+=1
    return ls

拜拜

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/828858.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号