【发布时间】:2014-08-01 17:17:26
【问题描述】:
我在我找到的一个网站(Euler 项目)上做这个问题,并且有一个问题涉及找到一个数字的最大素数。我的解决方案在非常多的情况下失败了,所以我想知道如何简化这段代码?
""" Find the largest prime of a number """
def get_factors(number):
factors = []
for integer in range(1, number + 1):
if number%integer == 0:
factors.append(integer)
return factors
def test_prime(number):
prime = True
for i in range(1, number + 1):
if i!=1 and i!=2 and i!=number:
if number%i == 0:
prime = False
return prime
def test_for_primes(lst):
primes = []
for i in lst:
if test_prime(i):
primes.append(i)
return primes
################################################### program starts here
def find_largest_prime_factor(i):
factors = get_factors(i)
prime_factors = test_for_primes(factors)
print prime_factors
print find_largest_prime_factor(22)
#this jams my computer
print find_largest_prime_factor(600851475143)
使用大数时它会失败,我猜这就是问题的重点。 (电脑卡住,告诉我内存不足并询问我要停止哪些程序)。
************************************感谢您的回答.无论如何,代码中实际上存在一些错误。所以这个(低效代码)的固定版本如下。
""" Find the largest prime of a number """
def get_factors(number):
factors = []
for integer in xrange(1, number + 1):
if number%integer == 0:
factors.append(integer)
return factors
def test_prime(number):
prime = True
if number == 1 or number == 2:
return prime
else:
for i in xrange(2, number):
if number%i == 0:
prime = False
return prime
def test_for_primes(lst):
primes = []
for i in lst:
if test_prime(i):
primes.append(i)
return primes
################################################### program starts here
def find_largest_prime_factor(i):
factors = get_factors(i)
print factors
prime_factors = test_for_primes(factors)
return prime_factors
print find_largest_prime_factor(x)
【问题讨论】:
-
第一步是将
range替换为xrange。 -
这两个函数的逻辑有什么区别?
-
也检查this thread
-
range(600851475143)将占用至少 600851475143 x 4 字节的内存。xrange不会(假设是 python2)。 -
如果谈到高效的方式,我建议阅读基础知识,例如。从wiki Integer factorization开始。你这样做的直接方式是运行内存或时间。
标签: python primes prime-factoring factorization