• 使用列表实现筛选法求素数(利用python的内置函数,快速求素数)


    代码如下: (具体内置函数可以自行搜索,我主要记录这样求素数的原理即好处,帮助大家和自己体验一下这种高级的感觉【来自小白的乐趣】)

     1 maxNumber = int(input("请输入一个大于2的自然数"))
     2 lst = list(range(2, maxNumber))
     3 print(lst)
     4 # 最大整数的平方根
     5 m = int(maxNumber ** 0.5)
     6 for index, value in enumerate(lst):
     7 
     8     # 如果当前数字已大于最大整数的平方根,结束判断(素数判断方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。)
     9     if value > m:
    10         break
    11     # 对该位置之后的元素进行过滤,每次除以value,若余数为0,则淘汰它
    12     lst[index + 1:] = filter(lambda x: x % value != 0, lst[index + 1:])
    13     print("lst:",lst)
    14 print(lst)

    原理:

    前提须知:
    素数判断方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

    举例 使用36来跑跑上面的代码

    lst = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]

    m = 6

    进入循环

    ① index = 0 value = 2(对应lst中的第一个元素)
    从lst[1]开始进行过滤 找出lst里不能被2整除的数
    lst = [2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35]

    ② index =1 value = 3(对应lst中的第二个元素)
    从lst[2]开始进行过滤 找出lst里不能被3整除的数
    lst = [2, 3, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35]

    ③ index = 2 value = 5 (对应lst中的第三个元素)
    从lst[3]开始进行过滤 找出lst里不能被5整除的数
    lst = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]

    ④ index = 3 value = 7
    此时已经大于6(36的平方根),所以结束判断

    相比从2到所求数的平方根进行遍历,通过是否能被整除来求素数,这个的循环次数更少,譬如从上述②到③,就已经省去了对是否能整除4的判断,若我们所求的数越大,那这个体现的效率就越高(因为能减少更多的运算次数),为什么可以这样呢?如果一个数不能被2整除,那它肯定不能被4整除(即不能被n整除的数,肯定不能被n的倍数整除),因此就可用这规律减少运算次数

  • 相关阅读:
    Jetson AGX Xavier初始化
    Jetson AGX Xavier更换apt-get源
    Mac远程访问Ubuntu
    Anaconda安装和环境的搭建
    C# NotifyIcon 托盘控件
    VS2010+OpenMP的简单使用
    VS2010+OpenCV3.4.1+zbar 64位
    datatbales 使用笔记
    ubuntu16.04 常用软件
    crontab不能正常执行的五种原因
  • 原文地址:https://www.cnblogs.com/mmimo/p/13748775.html
Copyright © 2020-2023  润新知