我的逻辑在python函数中用于检查素数的缺陷是什么?

时间:2017-10-02 00:13:56

标签: python syntax logic

我相对较新的Python,并试图构建一个函数来检查素数,因为我认为这将是一个很好的入门项目,但我的代码将所有内容作为素数返回,所以它显然出了问题。我觉得这是一种效率低下的方法,但我想先了解如何做到这一点。到目前为止,这是我的代码:

def Prime(n):
    if n == 1 or n == 2 or n == 3:
        print("This number is prime.")
    else:
        i = n - 1
        while i > 0:
            if n % i == 0:
                break
                print("This number is not prime.")
            else:
                i = i - 1
            print("This number is prime.")

def Main():
    n = int(input("What is the number you'd like to check?"))
    Prime(n)
    answer2 = input("Thank you for using the prime program.")

Main()

4 个答案:

答案 0 :(得分:1)

从数学上讲,你可以只检查0和sqrt(n)之间的所有int来判断一个数字是否为素数或者不是逻辑,你缺少负数处理加上其他东西请看下面的代码:

def prime(n):
    n = abs(n)
    if n<4: return True
    i = int(sqrt(n))
    while i > 1:
        if n % i == 0: return False
        i -= 1
    return True

另外你应该将它添加到你的导入

from math import sqrt

答案 1 :(得分:0)

解释逻辑缺陷并不容易,但您可以看到以下代码

def Prime(n):
    if n == 1 or n == 2 or n == 3:
        print("This number is prime.")
    else:
        i = n - 1
        while i > 0:
            if i == 1 or n == 2 or n == 3:
                print("This number is prime.")
                break
            if n % i == 0:
                print("This number is not prime.")
                break
            else:
                i = i - 1

def Main():
    n = int(input("What is the number you'd like to check? "))
    Prime(n)
    print("Thank you for using the prime program.")

Main()

答案 2 :(得分:0)

以下是您的计划,其中包含一些更改:

def Prime(n):
    if n == 1 or n == 2 or n == 3:
        print("This number is prime.")
    else:
        i = n - 1
        while i > 1:
            if n % i == 0:
                print("This number is not prime.")
                return
            i = i - 1
        print("This number is prime.")
        return

def Main():
    n = int(input("What is the number you'd like to check? "))
    Prime(n)
    print "Thank you for using the prime program."

Main()

首先,i现在比较i > 1而不是0,因为每个数字都可以被1整除,因此如果使用了原始条件,所有数字都将是素数。

其次,break语句被return替换。尽管break可行,但该程序在这种情况下需要进行更多修改,因为素数的消息总是在末尾打印(而不是主要消息)。此外,在打印之后移动了return语句以实际获得打印。更重要的是,数字是素数的消息被移到while之外 - 否则消息将在每次迭代时打印。

我还删除了else,并且iwhile循环中正在递减,这对我来说是一个更具可读性的选择。

最后,我认为你的最后一句话应该是一个输出,它现在是。我还在用户提示消息中添加了一个空格,以便显示更好的数字。

答案 3 :(得分:0)

好的,首先,您的代码永远不会打印&#34;这个数字不是素数。&#34;因为你在它之前发表了一个休息声明。您可能希望将这两行反转为:

print("This number is not prime.")
break

此外,行i = n - 1应更改为i = n,以便您检查起始编号,而不仅仅是数字小于它。因此,如果您现在尝试代码,您会注意到您正在打印您检查的每个数字是否为素数,而不仅仅是输入值。要使用代码结构解决此问题,请使用标志。例如:

    def Prime(n):
    flag = true
    if n == 1 or n == 2 or n == 3:
        print("This number is prime.")
    else:
        i = n
        while i > 0:
            if n % i == 0:
                print("This number is not prime.")
                break
            else:
                i = i - 1
        if flag == true:
            print("This number is prime.")

标志检查应该在循环之外。