在这个素性测试程序中,当我输入素数而不是“真”时,会打印“无”。如何让它打印'真'?
def main():
import math
def check_n(n):
n_s = int(math.sqrt(n))
for i in range(2, n_s):
if (n_s % i) == 0:
return False
break
else:
return True
def msg():
n = int(input('Enter a number, I will return True if it is a prime'))
return n
print(check_n(msg()))
main()
答案 0 :(得分:2)
您需要将int(math.sqrt(n))
更改为int(math.sqrt(n)+1)
,因为range
会一直运行到n_s-1
。因此,如果输入为5,range(2,int(math.sqrt(5)))
只是range(2,2)
,则为空。
此外,您需要在return True
循环之外取for
,否则您的代码可能会在过早的阶段停止。您在break
之后也不需要return False
语句(该功能永远不会到达该行,因为如果它进入False
,它将返回if
语句)。
最后,将if (n_s % i) == 0:
更改为if (n % i) == 0:
,因为您需要检查n
是否可以被i
整除(而不是其平方根)。
这是一个更干净的版本:
import math
def check_n(n):
n_s = int(math.sqrt(n)+1)
for i in range(2, n_s):
if (n % i) == 0:
return False
return True
def msg():
n = int(input('Enter a number, I will return True if it is a prime'))
return n
print(check_n(msg()))
答案 1 :(得分:1)
首先:你的休息声明是多余的。
第二:对于诸如3的值,for循环永远不会执行,因为值 n_s小于2,因为for循环不执行 python返回默认值None(在返回时返回) 没有指定值)。 因此你的check_n(n)函数必须是
def check_n(n):
n_s = int(math.sqrt(n))
for i in range(2, n_s + 1):
if (n_s % i) == 0:
return False
return True
答案 2 :(得分:1)
一个班轮:
check_n = lambda n : sum([i for i in range(2, int(math.sqrt(n)+1)) if n % i == 0]) == 0
不要过于复杂化......
答案 3 :(得分:0)
当您选择小于9的任何内容时,您的范围是(2,2)或None
。
因此,要解决您的第一个问题:将{2}添加到n_s
(输入3)
您的逻辑也存在问题。
您的for
循环应该检查n
mod i
是否为0,而不是n_s
。
这应该有效:
def main():
import math
def check_n(n):
n_s = int(math.sqrt(n)+1)
for i in range(2, n_s):
if (n % i) == 0:
return False
return True
def msg():
n = int(input('Enter a number, I will return True if it is a prime'))
return n
print(check_n(msg()))
main()