【问题标题】:Trying to find the prime numbers using Python尝试使用 Python 查找素数
【发布时间】:2015-02-28 02:11:39
【问题描述】:

下面是我使用 Python 查找质数的代码,但它不起作用。这里的函数prime 将接受一个整数作为输入并返回它是否是一个素数。能否请您解决问题并解释一下。

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

我想我已经整理了第一个问题,第一个“if”语句应该是if x == 0 or x == 1。现在剩下的呢。

【问题讨论】:

  • 在您的第一个if 语句中,您检查是x == 0 还是1 != 0。这将始终返回 True
  • 请检查我的编辑。
  • 看起来可行。一般来说,不纠正问题是很有用的,因为它保持它是一个有效的问题。就目前而言,这是一个关于为什么工作代码不起作用的问题。
  • 没有。 return true 仍然在错误的位置,检查 9 是否是素数。
  • @Trengot:已编辑并附加评论。

标签: python


【解决方案1】:

以下代码用于查找从 2 到第 n 个数的素数。 例如,下面的代码将打印 2 到 50 之间的质数,并且它还将打印 2 到 5o 之间的非质数。

import time
i=2
j=2
count=0
while(i<50):
 while (i>j):
    if (i%j)==0:
      count=count+1
      j=j+1
    else:
      j=j+1
 if count==0:
    print i," is a prime"
 else:
    print i," is not a prime"
 i=i+1
 j=2
 count=0
 time.sleep(2)

【讨论】:

    【解决方案2】:

    问题是 return true 不应该在 for 循环完成之前发生。

    我们在原始代码中拥有的是一些针对琐碎案例的测试(x 小于 3) 然后是一个用于测试所有较大数字的循环。

    在循环中尝试将 x 除以一个较小的数字(从 2 开始),然后如果它均匀除,则返回 False,如果不是则返回 True,这是错误的,而不是返回 true 时,应该允许循环重复,并且应该用下一个数字再次尝试除法,并且只有在除数(来自 for 循环)的供应已经用完之后才应该返回 true。

    这是一个固定版本:

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

    其他人评论说循环不需要一直持续到 x 并且在 sqrt(x) 处停止就足够了,他们是正确的。在几乎所有情况下,这样做都会使其更快。

    如果您有一个小素数列表(最多 sqrt(x)),则可以得到另一个加速 - 您只需要测试 sqrt(x) 以下素数的可分性,而不是该范围内的每个整数。

    【讨论】:

    • 它的工作。能否请您稍微宽泛地解释一下最后一个 return True
    【解决方案3】:

    你的for 循环什么?

    if x % n == 0:
        return False
    else:
        return True
    

    顺便说一句等于return bool(x % n)

    所以,当n == 2 时,您会在第一次迭代中返回。

    整个for循环等于return bool(x % 2),它只是检查x是否可以被2整除。
    这不是你想要的。

    那么,你想要什么?

    您想检查x 是否不能被range(2, x) 中的任何数字整除。

    你知道x不是素数,如果你从range(2, x)中找到一个n,其中x % n == 0True。 你知道x 是素数,当range(2, x) 中没有n 时,x % n == 0True

    你什么时候可以说范围内的n 都不是x 的除数?
    检查范围内的所有ns 之后!

    After 是这里的关键。
    After 循环,您尝试在其中找到除数,你只能说x是素数。

    我希望你现在能理解其他人发布的没有解释的代码。


    注意:替代语法

    其他人发布的代码是正确的。但是,在 Python 中还有第二种写 for 的方法,使用 for .. else

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

    【讨论】:

    • 现在我明白了。非常感谢。也感谢for..else
    • 为什么要在这里使用for .. else 构造?在 for 循环中没有任何 break 语句,else 是多余的 - 只需将 return True 放在与初始 for 循环相同的缩进级别。
    • @Mark:你是对的。我提到了for .. else,因为原始代码与for .. else 之间的区别只是elsereturn True 的缩进级别。
    猜你喜欢
    • 2018-11-20
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多