为什么这会让一个素数通过?

时间:2014-07-10 23:13:06

标签: python-2.7

我要回过头来解决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是如何滑倒的?

2 个答案:

答案 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返回Trueis_prime(),而不是01