【问题标题】:python code giving wrong outputpython代码给出错误的输出
【发布时间】:2016-06-27 06:23:48
【问题描述】:

我在 python 中编写了以下代码来打印素数,但它的输出如下:

3,5,7,**9**,11,13,**15**,17,19,**21**,23,25............99

下面是代码:

def isprime(n):
    if n == 1:
        return False
    for x in range(2, n):
        if n % x == 0:
            return False
        else:
            return True

def primes(n = 1):
    while(True):
        if isprime(n): yield n
        n += 1
for n in primes():
    if n > 100: break
    print(n)

【问题讨论】:

  • 问题是什么?你期待会发生什么?
  • @starf:我认为这很清楚。素数列表包含不是素数的数字。拉胡尔只期待质数。

标签: python


【解决方案1】:

你的isprime 函数说:

for x in range(2, n):
    if n % x == 0:
        return False
    else:
        return True

这意味着在第一次迭代(当x==2 时),如果n%x 不为零,它将返回True。所以它会为任何奇数返回 True(大于 1,你跳过了)。

相反,如果循环中的 没有 个数字是因子,则您希望返回 True。

for x in range(2, n):
    if n % x == 0:
        return False
# the loop finished without returning false, so none of the numbers was a factor
return True

【讨论】:

    【解决方案2】:

    您返回True,因为该数字不能被一个数字整除。检查完所有个数字后,您需要返回 true。相反,你应该写

    def isprime(n):
        if n == 1:
            return False
        for x in range(2, n):
            if n % x == 0:
                return False
    
        return True
    

    另一个注意事项:如果您要测试素数,您只需要测试 数字的平方根。如果这个数不能被任何小于它的平方根的数整除,那么它也不能被任何更大的数整除,因此它必须是素数。这将有助于使您的代码更高效。

    【讨论】:

    • 另外,值得将n == 2 视为一个特例,然后只测试循环中的奇数因素。
    • 确实如此。此外,Sieve of Eratosthenes 之类的东西最适合查找低于给定值的所有素数。
    • Definitely!或this 用于给定范围内的素数。有关 Python 中各种素数筛选算法的比较,请参阅Fastest way to list all primes below N。为了测试单个大数的素数,Miller-Rabin... 但这对于 OP 来说可能有点太先进了。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2015-05-11
    相关资源
    最近更新 更多