这个Python质数函数有什么问题?

3

所以我只是想检查一下我的函数有什么问题。它输出素数没问题,但当我输入像4这样的数字时,它会打印出"4不是质数",然后又打印出"4是一个质数"。 问题在哪里?(我知道这很悲哀,但我已经花了8个小时来做这个(初学者))。

def isprime(n):
    if n == 1:
        print ("1 is not prime.")
    if n == 2:
        print ("2 is a prime number.")
    for x in range (2, n):
        if n%x == 0:
            print (n, "is not prime.")
        if n%x != 0:
            print (n, "is a prime number.")

3
你需要在你的函数中返回 TrueFalse,然后根据返回值打印内容。否则,你将得到多个打印结果。 - Waleed Khan
在此处检查解决方案:http://docs.python.org/2/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops - Barranka
除了下面的正确答案之外,尤其要记住在调试时打印出所有你关心的内容-- 在这种情况下,也包括 x。"print(n, "不是质数;它被 ", x,"整除")" 将立即揭示你的错误。 - user447688
2个回答

4
你的算法有误,需要在检测到因子后停止,并且如果没有因子就打印质数。以下是已经修正过的版本:
def isprime(n):
    if n == 1:
        print ("1 is not prime.")
        return
    if n == 2:
        print ("2 is a prime number.")
        return
    for x in range (2, n):
        if n%x == 0:
            print (n, "is not prime.")
            break
    else:
        print (n, "is a prime number.")

尽管在这种情况下,你可以使用 return 代替 break,并且不需要使用 else。(但是,这仍然是一个很好的演示 for…else 通常用于什么的例子。) - abarnert
同时,这仍然存在漏洞。对于1,它将打印“1不是质数”或“2是一个质数”,然后它将通过for语句,循环0次,触发else,并打印“1是一个质数”。对于2也是如此。您需要在这些if主体中添加return语句,或将其更改为if/elif/else(在else内部使用for…else循环)。 - abarnert

0
你应该在 print(n, "is not prime.") 下面加上一个 break 语句,否则它会继续循环遍历所有数字直到 n,这是不必要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接