在Python 3.4.1中查找素数

时间:2014-09-13 06:05:25

标签: python python-3.x

for n in range(2,10):
    for x in range(2,n):
        if n%x==0:
            print(n, 'equals to', x, '*', n//x)
            break
        else:
            print(n, 'is a prime number')

以下是我收到的输出。

3 is a prime number
4 equals to 2 * 2
5 is a prime number
5 is a prime number
5 is a prime number
6 equals to 2 * 3
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
8 equals to 2 * 4
9 is a prime number
9 equals to 3 * 3

但是,它正在重复这些价值观。此外,9不是素数。 请帮我纠正语法。

以下是链接: https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops

3 个答案:

答案 0 :(得分:5)

如果你拥有它,你的程序会检查n是否可以被一个因子整除。如果它很好,你正确打印它是复合的。如果不是,则立即将其打印为素数。问题是,在您检查了其他因素之前,您还不知道。仅仅因为9不能被2整除并不意味着它是素数。你也必须检查3。

这意味着稍微改变你的逻辑。在声明n为素数之前,您需要检查所有可能的因素。一种方法是使用额外的布尔变量。

for n in range(2,10):
    is_prime = True

    for x in range(2,n):
        if n%x==0:
            print(n, 'equals to', x, '*', n//x)
            is_prime = False
            break

    if is_prime:
        print(n, 'is a prime number')

请注意,"是素数"打印输出不再在内循环内部,它在它外面。

另一种方法是使用很酷的Python技巧并在内部循环中添加else子句。仅当循环退出而未命中else语句时,才会发生break子句。

for n in range(2,10):
    for x in range(2,n):
        if n%x==0:
            print(n, 'equals to', x, '*', n//x)
            break
    else:
        print(n, 'is a prime number')

请注意,将else子句添加到循环中的想法是Python主义。它不存在于其他语言中,如C或Java。因此,虽然整洁,但理解基于布尔变量的解决方案也是很好的。该技术适用于任何语言。

答案 1 :(得分:0)

根据您提供的链接,它在示例代码下面有一个声明

  

是的,这是正确的代码。仔细观察:else子句属于for循环,而不是if语句。

因此,您应该将else子句定位为内部for而不是if

答案 2 :(得分:0)

我很难理解实际情况。找到了这个答案https://stackoverflow.com/a/16451661/5203300