我正在研究关于欧拉问题3的项目,
13195的主要因素是5,7,13和29.这个数字最大的主要因素是600851475143?
我想出的代码如下:
def q_prime(a):
if a == 2:
return True
elif a < 2:
return False
for i in range(2,a):
if a%i == 0:
return False
else:
return True
def prime_factor(x):
prime_factors =[]
for i in range(1,x):
if q_prime(i) == True and x%i == 0:
prime_factors.append(i)
return prime_factors
调用13195的这个功能给了我[5,7,13,29]的预期。我尝试了一些其他组合,如1035,给出了[3,5,23]。但是,当我在600851475143上调用此函数时,我没有输出。而且,我也没有收到错误消息。它运行一段时间,并简单重启shell
我知道这不是一个优雅的代码,而且我猜测粗暴强行通过这样的问题,因为大量的代码导致了这个问题?到底发生了什么?
答案 0 :(得分:2)
编号600851475143太大了。您可以简化计算,如果在q_prime
和prime_factor
中,您将检查的数字不在范围[2,sqrt(n)+1]的范围[2,n] bun中。这也将返回正确的结果,但花费的时间更少:
import math
def q_prime(a):
if a == 2:
return True
elif a < 2:
return False
for i in range(2, int(math.sqrt(a) + 1)):
if a%i == 0:
return False
else:
return True
def prime_factor(x):
prime_factors =[]
for i in range(1, int(math.sqrt(x) + 1)):
if q_prime(i) == True and x%i == 0:
prime_factors.append(i)
return prime_factors
答案 1 :(得分:2)
考虑到问题的大小,您编写的这两个函数都存在问题。 q_prime(a)
循环到a
和prime_factor(x)
循环到x
每次迭代调用q_prime
。这使得您的算法O(N^2)
对于像600851475143
这样的数字来说太过分了。
更好的方法(O(√N) - >基本上是直接的结果):
sqrt(n)
收集因子,同时在找到每个因子的情况下收缩n
n
本身答案 2 :(得分:1)
当我尝试使用Python 2.7运行代码时会发生什么:
$ python primes.py
Killed: 9
问题是range(2, 600851475143)
尝试创建600851475141元素的列表。这太大了,无法放入计算机的内存中,因此Python程序会被杀死。
您可以尝试将range()
替换为xrange()
,但您的计划将需要很长时间才能完成。你需要一个更好的算法。
P.S。您的代码中还存在一个错误,这意味着它不适用于主要输入。