下面是我使用Python找不到素数的代码。这里函数prime
将取整数作为输入,并返回其是否为素数。你能解决问题并解释一下吗。
def prime(x):
if x == 0 or 1:
return False
elif x == 2:
return True
else:
for n in range(2, x):
if x % n == 0:
return False
else:
return True
我想我已经解决了第一个问题,第一个“if”语句应该是if x == 0 or x == 1
。那么其余的呢。
答案 0 :(得分:1)
您的for
循环是什么?
if x % n == 0:
return False
else:
return True
顺便说一下eqals return bool(x % n)
因此,您在第一次迭代时返回n == 2
。
整个 for
循环等于return bool(x % 2)
,它只会检查x
是否可被2分割。
那不是你想要的。
您想要检查来自x
的任何数字是否都无法归待range(2, x)
。
如果您从x
找到一个 n
,您知道range(2, x)
不是素数,{{1}是} x % n == 0
如果True
中有{strong>否 x
,n
为range(2, x)
,则x % n == 0
为素数。
您何时可以说范围中的True
都不是n
的除数?
后检查范围内的所有x
!
之后是关键。
在 循环之后,您尝试查找除数,您只能告诉n
是素数。
我希望您现在能够理解其他人发布的代码而无需解释。
其他人发布的代码是正确的。但是,在Python中,使用for .. else
:
x
答案 1 :(得分:0)
问题是在return true
循环完成之前for
不应该发生。
我们在原始代码中所拥有的是一些针对琐碎案例的测试(x小于3) 然后是一个测试所有较大数字的循环。
在循环中,尝试将x除以较小的数字(从2开始),然后如果它均匀地分开False
则返回,如果它不返回True
,则为错误,而不是返回true,应该允许循环重复,并且应该使用下一个数字再次尝试除法,并且只有在除数的提供(来自for循环)已经用尽之后才应该返回。
这是一个固定版本:
def prime(x):
if x <= 1:
return False
elif x == 2:
return True
else:
for n in range(2, x):
if x % n == 0:
return False
return True
其他人评论说,循环不需要一直持续到x,并且停止在sqrt(x)就足够了,它们是正确的。这样做几乎在所有情况下都会更快。
如果你有一个小素数列表(高达sqrt(x)),你可以获得另一个加速 - 你只需要通过sqrt(x)以下的素数来测试可分性,而不是该范围内的每个整数。
答案 2 :(得分:0)
以下代码用于查找从2到n号的素数。 例如,下面的代码将打印从2到50的素数,并且它将打印2到5o之间的数字,这不是素数。
import time
i=2
j=2
count=0
while(i<50):
while (i>j):
if (i%j)==0:
count=count+1
j=j+1
else:
j=j+1
if count==0:
print i," is a prime"
else:
print i," is not a prime"
i=i+1
j=2
count=0
time.sleep(2)