如何让素数在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 = 2
。 n % prime != 0
,所以 n
,即 5
产生
- 然后,
prime = 3
。 n % prime != 0
,所以 5
再次产生
- 然后,
prime = 4
,n % prime != 0
,所以5
又一次产生了
- 最后,
prime = 5
。 n % 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
我的素数查找代码正在尝试所有数字,因此它会打印几次素数。例如: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 = 2
。n % prime != 0
,所以n
,即5
产生 - 然后,
prime = 3
。n % prime != 0
,所以5
再次产生 - 然后,
prime = 4
,n % prime != 0
,所以5
又一次产生了 - 最后,
prime = 5
。n % 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