我要回过头来解决Project Euler的问题,看看我是否可以加速我的代码,这是003:找到一个非常大的数字的最大素数因子。
def is_prime(n):
'''check if n is prime'''
if n == 1: return 0
elif n == 2: return 1
elif n % 2 == 0: return 0
for i in range(3, int(n**0.5) +1, 2):
if n % i == 0:
return 0
else:
return 1
factor_list = []
the_number = 600851475143
for i in range(3, int(the_number**0.5) +1, 2):
if the_number % i == 0: factor_list.append(i)
print factor_list
for i in factor_list:
if is_prime(i) == False: factor_list.remove(i)
print factor_list
print max(factor_list)
第一次打印电话打印:[71, 839, 1471, 6857, 59569, 104441, 486847]
到目前为止,这么好,打印n的前n ^ 0.5因子。
第二次打印调用打印:[71, 839, 1471, 6857, 104441]
等等,104441是如何通过is_prime函数的呢?
第三次打印电话打印错误的答案,即104441.我的问题是104441是如何滑倒的?
答案 0 :(得分:2)
我相信你的for循环存在问题。当你使用for-each循环时,你通常不想删除值,因为它最终会跳过某些值。所以我认为发生的事情是59569
被删除,然后因为你删除它,你的下一个i
值是486847
。
如果您需要有效的解决方案,请参阅史蒂夫哈的代码。
答案 1 :(得分:2)
尝试在循环时修改列表总是很棘手。只需构建您需要的列表,而不是尝试提取您不需要的值,这样更好更安全。
此代码完美无缺:
factor_list = [n for n in xrange(3, int(the_number**0.5) +1, 2) if the_number % n == 0]
print(factor_list)
prime_factors = [n for n in factor_list if is_prime(n)]
print(prime_factors)
answer = max(prime_factors)
print(answer)
此外,您应该从False
返回True
和is_prime()
,而不是0
和1
。