python函数中检查素数的逻辑有什么缺陷?

python函数中检查素数的逻辑有什么缺陷?,python,syntax,logic,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:

我对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()

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

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()

以下是您的程序,其中有一些更改:

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
语句在打印之后移动,以实际获得打印。更重要的是,数字是素数的消息在时移到了之外,否则消息将在每次迭代中打印出来

我还删除了
else
,而
I
while
循环中正好递减,这对我来说是一个更可读的选择


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

从数学上讲,您只能检查0和sqrt(n)之间的所有整数,以判断数字是否为素数。至于逻辑,您缺少负数处理以及其他内容,请参阅我的以下代码:

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

首先,你的代码永远不会打印“这个数字不是素数”,因为你在它前面放了一个break语句。您可能希望反转这两行,使其成为:

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.")

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

函数内部的打印是重复的,这样的行为是不可取的。python方法是返回一个布尔值,并且显示正确消息的原因。您可能想要实现的另一个更改是将
i=n-1
更改为
i=n**0.5+1
    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.")