• Python程序设计——厄拉多塞素数筛选法的应用


    一.厄拉多塞素数筛选法

     

     

     我用我自己的话,来说一说我对它的理解:

    它的核心是isPrime数组,这个数组有什么用呢?它用来区分从1到100中,谁是素数,谁是合数。它是怎么区分的呢?它把素数设为True,而把合数设为False。它是用什么方法设置True和False的呢?它从2开始,4、6、8、10......都是2的倍数,所以都是合数,所以都设为False;然后是3,6、9、12......都是3的倍数,所以都是合数,所以都设为False;然后是4,4已经是False,所以看5......

    通过这样的方法,就可以区分出素数和合数。

    二.厄拉多塞素数筛选法的应用

    这道题值得一试,容易出成果,建议大家做一做。

    1. import stdarray
    2. import stdio
    3. import sys
    4. n = int(sys.argv[1])
    5. a = stdarray.create2D(n, n, True)
    6. for i in range(2, n):
    7. istimes = stdarray.create1D(n+1, True)
    8. istimes[i] = False
    9. for j in range(2, n//i+1):
    10. istimes[i*j] = False
    11. for j in range(i, n):
    12. for k in range(i, n):
    13. if (istimes[j] == False) and (istimes[k] == False):
    14. a[j][k] = False
    15. for row in a:
    16. for v in row:
    17. if v == True:
    18. stdio.write('* ')
    19. else:
    20. stdio.write(' ')
    21. stdio.writeln()

    这里说一句,stdio和stdarray不是系统自带的,而是书的作者编的。所以刚开始是不能用的,如果想用,得去官网下载。

    怎么在官网下载呢?首先进入这个网址Introduction to Programming in Python: An Interdisciplinary Approach (princeton.edu)

    然后在To get started栏目里找到We also provide I/O libraries for reading and writing text, drawing graphics, and producing sound.点进去I/O libraries,进入这个网址:

    Python Programs in the Textbook (princeton.edu)

    然后就可以下载stdio-python.zip文件了,下载以后解压,里面有10个python文件,只需要把stdio.py和stdarray.py文件复制上,然后粘贴到.spyder-py3文件夹中,这时temp.py和stdio.py和stdarray.py三个文件都在.spyder-py3文件夹中,并且你还会发现,这三个文件都是平级的(意思是不存在temp.py文件在a文件夹中,然后a文件夹和stdio.py文件和stdarray.py文件在.spyder-py3文件夹中,因为这叫不平级),这下子你在temp.py文件里使用import stdio和import stdarray就不会报错了。

     这道题的关键是什么呢?

    这道题的核心,除了istimes数组以外,就是选出i和j互素的a[i][j],它是怎么选出的呢?它用排除法选出的,选出i和j不互素的a[i][j],剩下的就是i和j互素的a[i][j]。那它是怎么选出i和j不互素的a[i][j]的呢?它根据互素的定义:只有共同因子1,比如4和9,3和8,2和7,那么不互素就是有公因子的意思,比如2和4,4和6,6和9,所以我们选出有公因子的i和j就可以。那怎么选呢?我们用istimes数组,先从2开始,2设为False,然后4、6、8、10、12、14......凡是2的倍数,都设为False,这时我们从里面挑数,先挑4和6,不互素吧,然后挑4和8,也不互素吧,不信邪再试一个8和10,还是不互素吧,这说明什么?是不是说明,凡是设为False的俩数,就都是不互素的?嗯,确实是这样。然后循环,用一个新的istimes数组,从2后面的3开始,3设为False,然后6、9、12、15.......凡是3的倍数,都设为False,凡是设为False的俩数,就都是不互素的。然后循环,再用一个新的istimes数组,从3后面的4开始......是不是感觉有点奇妙啦?

    我的代码,就是完全按照这个思路走的,大家质疑的,怀疑的,可以自己跑一跑看看哟。

  • 相关阅读:
    华为机试 - 最长连续子序列
    AES简写
    uniapp、微信小程序返回上页面刷新数据
    spring boot项目优雅停机
    Java程序设计——Swing UI 布局管理器(四)
    给你安利一款国产良心软件uTools
    【CQF Finance Class 3 债券】
    重磅,瑞士药监局 发布 EU GMP附录1《无菌药品生产》官方解读!
    解决Jackson解析JSON时出现的Illegal Character错误
    详解Java Chassis 3与Spring Cloud的互操作
  • 原文地址:https://blog.csdn.net/a15735748145a/article/details/126095399