如何让素数在Python中打印一次

How to let prime number print once in Python

我的素数查找代码正在尝试所有数字,因此它会打印几次素数。例如:5/2、5/3、5/4。所以它会打印 5 3 次。

def prime_number_generator(num):
    for n in range (1,num):
        for prime in range (2,n):
            if (n%prime) ==0:
                break
            else:
                yield n

number = input('Please input the number:') 
if number.isnumeric():
    num = int(number)
    if num <= 2:
        print('Number must be greater than 2') 
    else: 
        for prime in prime_number_generator(num):
            print(prime, end=', ') 
else: 
    print('Must be a positive integer') 

输入为 27 的输出:

3, 5, 5, 5, 7, 7, 7, 7, 7, 9, 11, 11, 11, 11, 11, 11,
 11, 11, 11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 
15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 
17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 
19, 19, 21, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 
23, 23, 23, 23, 23, 23, 23, 23, 25, 25, 25,

这不是您唯一的问题。您还(错误地)返回 15 作为素数,因为如果不能除以 2(第二个 for 循环的第一次迭代),您会立即假设该数字是素数。试试这个(注意 else 的缩进):

def prime_number_generator(num):
    for n in range (2, num):
        for prime in range (2, n):
            if (n % prime) == 0:
                break
        else:
            yield n

有关 Python 中 for..else 构造的解释,请参见 this question

问题

在这个函数中:

def prime_number_generator(num):
    for n in range (1,num):
        for prime in range (2,n):
            if (n%prime) ==0:
                break
            else:
                yield n

如果不能被 prime 整除,您将得到 n。这是 n = 5:

时发生的情况的示例
  • 首先,prime = 2n % prime != 0,所以 n,即 5 产生
  • 然后,prime = 3n % prime != 0,所以 5 再次产生
  • 然后,prime = 4n % prime != 0,所以5又一次产生了
  • 最后,prime = 5n % prime == 0,所以循环被打破了。

然后对下一个 n

重复此过程

如何修复

您可以从 if 中删除 else 子句,并将其添加到 for 循环中。这意味着仅当 for 循环未被破坏时才会产生 n,也就是说,仅当 n 不能被 2 和 [=35] 之间的任何数字整除时=].

所以你可以像这样重写你的函数:

def prime_number_generator(num):
    for n in range (1, num):
        for prime in range (2, n):
            if (n % prime) == 0:
                break
        else:
            yield n