【问题标题】:Python: determining if a number is prime [duplicate]Python:确定一个数字是否为素数
【发布时间】:2015-01-22 18:50:32
【问题描述】:

我是 Python 新手,我正在尝试编写一个代码来检查一个数字是否为素数。到目前为止,我已经写了这个:

def main():
     n = input("Enter number:")
     isprime(n)

def isprime():
    x = Prime
    for m in range (1,n+1,1)
        result = n % m
        print result


main()

我不确定在此之后如何进行。我知道我必须定义 isprime。任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 您知道如何在纸上进行操作,而您只是在将其写入代码时遇到了问题吗?或者你根本不知道该怎么做? x = Prime 是什么?
  • @Takendarkk 我不确定如何在纸上和代码上做到这一点。我猜 X = Prime 应该是消息,当它说它是 True 时(意味着输入的数字是素数)。

标签: python


【解决方案1】:

您的第一个也是最大的问题是,您需要先将n 作为isprime 的参数列出,然后才能在isprime 中使用它,然后才能在main 中传递参数。有关详细信息,请参阅Defining Functions 上的教程。但基本上,它是这样的:

def isprime(n):

此外,x = Prime 将引发NameError,因为没有任何东西名为Prime。鉴于它实际上根本没有做任何事情,你应该删除它。

当然,这不会使它成为一个完整的工作主要测试功能,但它是如何从你所在的地方开始。


下一步是考虑从函数中返回什么。如果你找到一个除以n 的值,那么显然n 不是素数,因此isprime 是假的。如果您尝试了所有可能性并且没有找到任何可以划分n 的东西,那么isprime 是正确的。因此,在正确的位置使用两个return 语句,您就可以完成该功能。


一旦它至少总是返回 True 或 False,你就有 bug 需要修复。*

看看你从range(1, n+1, 1) 得到了什么数字。保证其中两个数字可以除任何n。你如何避免这个问题?


在你让它工作之后,你就可以开始优化它了。如果您在 Wikipedia 上查找 primality test,您可以看到一种非常简单的方法来改进幼稚的试用划分测试。一些研究将显示不同算法的优缺点。但是,如果您所拥有的速度足以满足您的目的,那么通常不值得花更多精力进行优化。


* 您可能需要考虑编写一个测试程序,在一堆数字上调用 isprime 并将结果与​​正确答案进行比较(对于您已经知道的答案 - 1 不是素数,2 是素数,17 是素数,等等)。这称为Test Driven Development,这是确保您已涵盖所有可能情况的好方法 - 包括 0、1、2、-3 等异常值。

【讨论】:

    【解决方案2】:

    您的isprime 非常接近。第一行 x = Prime 是不必要的,所以让我们去掉它。

    现在,让我们看看您接下来要做什么:
    您似乎想检查是否有任何数字可以完美地划分n。虽然这是正确的方法,但您正在测试的数字中包含 n1。这是错误的,原因很明显。

    还有另一个错误:您使用 n 却没有定义它(我认为您希望它成为您的函数的参数)。所以让我们把所有这些放在一起:

    def isprime(n):
        for m in range(2, n):
            if not n%m:  # m divides n perfectly
                return False
        return True  # if n were not prime, the function would have already returned
    

    但更进一步,您实际上不必检查2n-1 之间的每个数字。您只需要检查2n 的平方根之间的数字:

    def isprime(n):
        for m in range(2, int(n**0.5)+1):
            if not n%m:
                return False
        return True
    

    【讨论】:

    • 或下一步:return all(n%m for m in range(2,int(n**0.5+1)))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2014-06-05
    • 2011-11-27
    • 1970-01-01
    • 2016-12-03
    • 2011-05-31
    • 2016-09-27
    相关资源
    最近更新 更多