Python 3 Project Euler Run Time

时间:2016-03-21 14:04:01

标签: python

这是我对Project Euler Problem 3

的解决方案
def max_prime(x):
    for i in range(2,x+1):
            if x%i == 0:
                    a = i
                    x = x/i
    return a
max_prime(600851475143)

运行需要太多时间。有什么问题?

3 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

  • 如果您正在使用Python 3.x,请使用//进行整数除法而不是/(这将返回浮点数)。
  • 您的解决方案并未考虑素因子的多重性。取24,其分解为2*2*2*3。在尝试下一个数字之前,您需要将x除以2三次。
  • 您不需要尝试所有值到x的初始值。您可以在x到达1后停止(您知道此时已达到最高除数)。

一旦解决了这三个问题,您的解决方案就能正常运行。

答案 1 :(得分:0)

==> projecteuler3.py

import eulerlib

def compute():
    n = 600851475143
    while True:
        p = smallest_prime_factor(n)
        if p < n:
            n //= p
        else:
            return str(n)


# Returns the smallest factor of n, which is in the range [2, n]. The result is always prime.
def smallest_prime_factor(n):
    assert n >= 2
    for i in range(2, eulerlib.sqrt(n) + 1):
        if n % i == 0:
            return i
    return n  # n itself is prime


if __name__ == "__main__":
    print(compute())

答案 2 :(得分:0)

您的解决方案正在尝试迭代最多600851475143,这不是必需的。您只需要迭代到最大素数的平方根即可。

from math import sqrt


def max_prime_factor(x):
    i = 2
    while i ** 2 <= x:
        while x % i == 0:  # factor out ALL multiples of i
            x //= i
        i += 1
    return x


print(max_prime_factor(600851475143))