嗨我正在制作一个功能,检查一个数字是否是素数,但它告诉我9是素数。
def eprimo(num):
if num < 2:
return False
if num == 2:
return True
else:
for div in range(2,num):
if num % div == 0:
return False
else:
return True
答案 0 :(得分:6)
您的for
循环在第一次迭代后立即退出时检查您的号码是否可以被2整除。如果您的号码是偶数,它将返回False
;否则,它将返回True
。
解决方案不是立即返回True
;等待循环中所有迭代的结束:
for div in range(2, num):
if num % div == 0:
return False
return True
或者,使用all()
构造:
return all(num % div != 0 for div in range(2, num))
答案 1 :(得分:2)
无论你是否完成了检查,你都会从for循环的第一次迭代中返回。除非数字肯定不是素数,否则你不应该从循环内部返回。如果循环结束,请移除else
并仅返回True
。
def eprimo(num):
if num < 2:
return False
if num == 2:
return True
else:
for div in range(2,num):
if num % div == 0:
return False
return True
优化旁注:您实际上不需要检查所有除数候选者num
。您只需要检查num
的平方根。
答案 2 :(得分:0)
不是测试范围(2,num)中的所有除数,而是可以提取偶数的测试,然后仅对奇数进行循环。另外,正如比尔蜥蜴建议的那样,你可以停在num的平方根处。这将是原来的两倍:
def eprimo(num):
if num < 2:
return False
if num % 2 == 0:
return num == 2
div = 3
while div * div <= num:
if num % div == 0:
return False
div += 2
return True