到目前为止我所做的是:
def check_prime(x):
if x >= 2:
for n in range(2, x - 1):
if x % n == 0:
return False
else:
return True
else:
return False
但是当我检查是否有任何数字> = 2是素数时,它会返回None
而不是True
或False
。 check_prime(0)
返回False
,check_prime(1)
返回False
。为什么任何数字> = 2返回None
以及如何解决此问题。
答案 0 :(得分:2)
您的函数错误,因为您不应该在循环中返回True(在您的代码中循环将始终运行一次)。
def check_prime(x):
if x >= 2:
for n in range(2, x ):
if (x % n) == 0:
return False
#after the complete for n loop
return True
else:
return False
结帐工作小提琴:http://pythonfiddle.com/check-prime
除此之外,您可以通过将x
(向上)的平方根作为循环的终点来优化您的代码(如果您愿意)(不要忘记自range
后的+1不包括在内)。因为一旦超过平方根,您将获得镜像选项。 (6×4 = 4 * 6 = 20. 20的平方根为5)。
答案 1 :(得分:0)
问题1:问题是range(n, x-1)
。
如果您输入的是2或3,range(2, x-1)
将是一个空列表,因为range
的第二个参数是独占的。
由于你只是在for循环中返回并且它永远不会到达那里,它返回None(即它什么都不返回)。
问题2:除了x = 2
或x = 3
从未输入for循环外,您的代码还存在一些问题。
正如你所写,它将在第一次迭代中返回。当然,如果您知道x % n == 0
x
不是素数而且可以返回False
。但即使n
不是x
的因素,您仍然需要检查其他潜在因素。
您应该在for循环之外返回True
,而不是在其中。
<强>解决方案:强>
if x == 2: return True
if x%2 == 0 or x < 2: return False
for n in range(3, x/2, 2):
if x % n == 0:
return False
return True
答案 2 :(得分:0)
这是您的固定代码。你有多个问题,即:
2
时,您进入了if
周期,但是您的循环没有执行,因此您获得了None
。range(start, end)
不包含end
,因此您无需撰写end - 1
。n
的每个号码(当您优化代码:)
时,您不必这样做),但是如果我有一个像99 = 3的数字* 33,它不能被2整除,并且尽管是一个复合数字,但仍将它归类为素数。您可以执行多项基本优化,例如最多sqrt(n)
检查数字,检查数字是否可以除以2以丢弃一半选项等等。
&#39;
def check_prime(x):
for n in range(2, x):
if x % n == 0:
return False
return True
答案 3 :(得分:0)
这是一种克服它的方式......
def prime(x):
factors = []
if x <= 0:
return False
if x == 1:
return False
if x == 2:
return True
for n in range(2, x):
if x % n == 0:
factors.append(n)
if len(factors) != 0:
return False
else:
return True