IsPrime函数错误?

2024-03-28 13:10:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我写这个函数来检查一个数是否是素数。它本身似乎工作得很好,但是当我在另一个函数中使用它时,它似乎不起作用。在

这是我的IsPrime函数:

def is_prime(n):
    boolean = False
    if n == 2 or n == 3:
            return True
    for x in range(3, int(n**0.5)+1, 2):
        if n % x == 0:
            return False
    return True

以下函数计算2000000以下所有素数之和:

^{pr2}$

我不明白我哪里做错了。在

如有意见,将不胜感激。在


Tags: or函数infalsetrueforreturnif
3条回答

is_prime没有检查偶数。例如,如果传递给它4,它会发现它既不是2也不是3,然后继续循环,它将执行一次,检查它是否可以被3整除(它不是)。退出循环,它将返回True,当我们知道4实际上不是质数时。在

您的problem10函数流中有一个错误。归根结底,您并没有实际使用递归problem10函数的结果值。您希望您的代码看起来像这样(假设您希望保留递归,则可以考虑使用循环):

def problem10(prime):
    """ calculates the sum of primes from this prime until 2000000 (2 * 10**6) """
    if prime >= 2000000:
       return 0
    elif is_prime(prime):
       return prime + problem10(prime + 1)
    else:
       return problem10(prime + 1)

请注意,这种函数方法有几个关键点需要考虑:

  1. 如果prime>;=2000000,则此函数表示空和。因此返回0。在
  2. 如果是素数(素数),则此函数应将素数加到和中
  3. 否则,这个和等于下一个数中的素数之和(因为我们必须排除较低的数,因为它不是质数)。在
  4. 与您最初的尝试相比:请注意在return语句中使用表达式大大简化了函数的逻辑(流)。它的可读性确实要高得多。另外,请注意,原来的函数是如何无法工作的,因为:

    a.您的函数不更新运行总数(结果)

    即使有,最终你还是会把None加到某个东西上,因为你原来的函数在prime>;=2000000的情况下没有返回任何结果。

更快的素数列表是这样的:

import numpy as np

def primesfrom2to(n):
    """ Returns a array of primes, p < n """
    assert n>=2
    sieve = np.ones(n/2, dtype=np.bool)
    for i in xrange(3,int(n**0.5)+1,2):
        if sieve[i/2]:
            sieve[i*i/2::i] = False
    return np.r_[2, 2*np.nonzero(sieve)[0][1::]+1]    

那么就是这些的总和:

^{pr2}$

如果要使用函数,建议重写:

^{3}$

相关问题 更多 >