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

Python 2.7 为什么这让一个素数通过?,python-2.7,Python 2.7,我将返回并处理ProjectEuler问题,看看是否可以加快我的代码,这是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:

我将返回并处理ProjectEuler问题,看看是否可以加快我的代码,这是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)
第一次打印调用打印:
[71839147168595959596104441486847]
到目前为止,还不错,打印前n^0.5的因数n

第二个打印调用打印:
[7183914716857104441]
等等,104441是怎么通过is_素数函数的


第三个打印调用打印不正确的答案,即104441。我的问题是104441是如何通过的?

我相信您的for循环存在问题。当使用for-each循环时,通常不希望删除值,因为它最终会跳过一些值。所以我认为现在发生的是,
59569
被删除,然后因为您删除了它,您的下一个
I
值是
486847


如果您想要一个有效的解决方案,请参考steveha的代码。

我相信您的for循环存在问题。当使用for-each循环时,通常不希望删除值,因为它最终会跳过一些值。所以我认为现在发生的是,
59569
被删除,然后因为您删除了它,您的下一个
I
值是
486847


如果您想要一个有效的解决方案,请参考steveha的代码。

在循环列表时尝试修改列表总是很棘手的。只建立您需要的列表,而不是试图提取您不需要的值,这样做更好、更安全

此代码非常有效:

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)

另外,您应该从
is_prime()
返回
False
True
,而不是
0
1
在循环列表时尝试修改列表总是很棘手的。只建立您需要的列表,而不是试图提取您不需要的值,这样做更好、更安全

此代码非常有效:

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)

此外,您应该从
is_prime()
返回
False
True
,而不是
0
1

为什么
is_prime
返回
0
1
而不是
True
False
?那么为什么要根据
False
检查输出?@murgatroid 0为False,任何非零值都为true,它们是同义词。实际上,返回布尔值的操作返回0或1。此外,这并不影响我的函数是否允许10441通过。0不是False,除非强制为布尔值。他们不平等。这不是C。当我第一次读这个问题时,我认为这可能是问题所在。
is_prime
为什么返回
0
1
而不是
True
False
?那么为什么要根据
False
检查输出?@murgatroid 0为False,任何非零值都为true,它们是同义词。实际上,返回布尔值的操作返回0或1。此外,这并不影响我的函数是否允许10441通过。0不是False,除非强制为布尔值。他们不平等。这不是C。当我第一次阅读这个问题时,我认为这可能是问题所在。非常好的建议和代码。我还是不明白为什么is_prime让104441漏掉了。在1,0 PEP-8风格或个人偏好上也是真是假,它们是同义词?
is_prime()
不会让104441漏掉;我的代码运行良好。问题是,在列表上循环时从列表中删除值的循环无法正常工作。这是一个循环问题。我的代码只是构建了所需的列表,并且
is_prime()
确实有效,因此结果是正确的。至于
True
False
问题,它在PEP 8中没有明确说明,但它只是一个编写代码的示例,说明了您的意思。你真的在评估真/假条件;您甚至可以在代码中与
False
进行比较。由于Python提供了内置的
True
False
,请使用它们。这不是C!:-)对不起,你误解了。我指的是为什么is在我的代码中穿行。你的代码比我写的代码效率高,也不那么笨拙——还有你的代码的额外优点。很抱歉给你带来了困惑。此外,将应用正确/错误的点。再次感谢。非常好的建议和代码。我还是不明白为什么is_prime让104441漏掉了。在1,0 PEP-8风格或个人偏好上也是真是假,它们是同义词?
is_prime()
不会让104441漏掉;我的代码运行良好。问题是,在列表上循环时从列表中删除值的循环无法正常工作。这是一个循环问题。我的代码只是构建了所需的列表,并且
is_prime()
确实有效,因此结果是正确的。至于
True
False
问题,它在PEP 8中没有明确说明,但它只是一个编写代码的示例,说明了您的意思。你真的在评估真/假条件;您甚至可以在代码中与
False
进行比较。由于Python提供了内置的
True
False
,请使用它们。这不是C!:-)对不起,你误解了。我指的是为什么is在我的代码中穿行。你的代码比我写的代码效率高,也不那么笨拙——还有你的代码的额外优点。很抱歉给你带来了困惑。此外,将应用正确/错误的点。再次感谢。谢谢,我认为你的答案是正确的。我不是在寻找工作代码,主要是想找出我的原始代码不工作的原因。我将通过逐步使用更小、更可行的数字来进行一些测试。我想这将证实你的答案。再次谢谢你,没问题。很高兴我能帮忙。谢谢你,我认为你的答案是正确的。我不是在寻找工作代码,主要是想找出我的来源