Python 试图理解Euler#3项目的解决方案

Python 试图理解Euler#3项目的解决方案,python,python-3.x,Python,Python 3.x,13195的主要因子为5、7、13和29。 数字600851475143中最大的素因子是什么?@ 我和自己有一个协议,如果我不能解决一个项目Euler问题,我将理解我能找到的最佳解决方案。我确实写了一个算法,适用于较小的数字,但效率太低,无法适用于较大的数字。所以我在谷歌上搜索了答案并开始研究它 这是他的密码: #!/usr/bin/env python import math def factorize(n): res = [] # iterate over all even

13195的主要因子为5、7、13和29。 数字600851475143中最大的素因子是什么?@

我和自己有一个协议,如果我不能解决一个项目Euler问题,我将理解我能找到的最佳解决方案。我确实写了一个算法,适用于较小的数字,但效率太低,无法适用于较大的数字。所以我在谷歌上搜索了答案并开始研究它

这是他的密码:

#!/usr/bin/env python
import math

def factorize(n):
    res = []
    # iterate over all even numbers first.
    while n % 2 == 0:
        res.append(2)
        n //= 2
    # try odd numbers up to sqrt(n)
    limit = math.sqrt(n+1)
    i = 3
    while i <= limit:
        if n % i == 0:
            res.append(i)
            n //= i
            limit = math.sqrt(n+i)
        else:
            i += 2
    if n != 1:
        res.append(n)
    return res

print max(factorize(600851475143))
#/usr/bin/env python
输入数学
def factorize(n):
res=[]
#首先迭代所有偶数。
当n%2==0时:
决议草案(2)
n/=2
#尝试奇数到sqrt(n)
极限=数学sqrt(n+1)
i=3
而我
  • 我怀疑
    +1
    float
    的不精确性有关(我不确定这是不是真的需要,或者只是作者的一种防御措施)

  • 第一个
    while
    循环将
    n
    中的所有两个因素都考虑在内。我看不出
    sqrt(n+1)
    将如何适应这里

  • 如果从小因素到大因素,则会自动消除所有组合候选项。想想看:一旦你计算出
    5
    ,你就会自动计算出
    10
    15
    20
    等等。无需检查它们是否为素数:到那时
    n
    将不会被它们整除


  • 我怀疑检查素性是破坏原始算法性能的原因。

    请针对第3点提出问题:任何不是素数因子的值都已经处理了自己的因子;当你到达
    9
    时,
    3
    已经计算出来了。