为什么我的质数校验码没有显示正确的输出?

Why is my prime number checking code not displaying the correct output?

我有一个代码可以检查一个数是否为质数,并相应地输出 "Yes" 或 "No"。但是当我输入 1763 时,即使它不是质数,它也会输出 "Yes"。该代码通过检查一个数是否可​​以被 2 到 n-1 之间的任何数整除来检查它是否为素数。所以当我输入 1763 时,它应该输出 "No" 因为 1763 可以被 41 整除。我的代码哪里出了问题?

def getNumber():
    n=int(input())
    return n

def isPrime(n):
    if n==2:
        print("Yes")
    else:
        for i in range (2,n):
            if n%i==0:
                print("No")
                break
            else:
                print("Yes")
                break

def main():
    n = getNumber()
    isPrime(n)

main()

问题是你没有考虑所有的除数。一旦您的第一个条件 (if n%i==0:) 为假,您就执行第二个 elif 条件并打印 "Yes"。

解决方案:您可以使用一个标志,它会在 只有 找到除数时变为 1,这意味着该数不是质数。下面是您的稍微修改的代码(仅显示部分代码,其余部分与您的相同)。正如@bereal 在评论中指出的那样,您不需要迭代到 n,而只需迭代到平方根 sqrt(n)math.ceil returns 最接近的四舍五入整数。

import math
def isPrime(n):
    flag = 0
    if n==2:
        print("Yes")
        return
    else:
        # for i in range (2, n):
        for i in range (2, math.ceil(np.sqrt(n)) + 1):
            if n%i==0:
                print("No")
                flag = 1
                break

    if not flag:
        print ("Yes")

1763
No

在你的循环中,你在第一次迭代时就中断了,即使你还不能证明它不是素数。

只有在检查了所有可能的除数到 n 之后才需要打印 yes(实际上只检查所有数字到 n 的平方就足够了)。

for i in range (2,n):
    if n%i==0:
        print("No")
        return
print("Yes")

只有在遍历所有可能的除数而没有找到一个数后,才应将一个数声明为质数。为此,您可以改用 for-else 构造,其中 else 块仅在 for 循环未使用 break 语句中止时执行:

def isPrime(n):
    if n==2:
        print("Yes")
    else:
        for i in range (2,n):
            if n%i==0:
                print("No")
                break
        else:
            print("Yes")