这是欧拉计画的问题。 600851475143的最大素数是多少? 我写了以下代码:
def prime_factors(x):
my_list = []
for no3 in range(2, int(x)):
i = 0
if x % no3 == 0:
for a in range(1, int(no3)):
if no3 % a == 0:
i = i + 1
if i == 1:
my_list.append(no3)
print(max(my_list))
prime_factors(600851475143)
它对于少量数字工作正常,但对于诸如“ 600851475143”这样的大量数字,代码不会给出输出,它只会继续运行。 我想知道这段代码有什么问题以及如何解决。
答案 0 :(得分:1)
您的每个循环都是2到n,因此对于2个循环,您的循环必须运行平方(n)次,然后才能给出答案
如果稍微更改循环,则可以使其更快。要查找数字n的因数,您不必检查所有小于n的数字。如果最多检查int(sqrt(n))就足够了。对于介于2和int(sqrt(n))之间的每个因子x,n / x也是一个因子。
因此,通过将循环更改为仅运行到int(sqrt(n)),您的代码将运行得更快
from math import sqrt
def is_prime(n):
for a in range(2, int(sqrt(n))):
if n % a == 0:
return False
return True
def prime_factors(x):
my_list = []
for no3 in range(2, int(sqrt(x))):
if x % no3 == 0:
# no3 and x/no3 are factors of x
if is_prime(no3):
my_list.append(no3)
if is_prime(x/no3):
my_list.append(no3)
print(max(my_list))
现在我们尝试一下
>>> prime_factors(600851475143)
6857
>>>