如果n从5到15
for i in range(3, int(math.sqrt(n))+1,2):
if n%i == 0:
return False
return True
另一个问题是;return True";它能这样写吗?如果不能,它们有什么不同?
for i in range(3, int(math.sqrt(n))+1,2):
if n%i == 0:
return False
else:
return True
对于第一个代码块,range(3, int(math.sqrt(n))+1,2)
意味着for
循环将从数字3开始,并每隔一个数字包含一次,直到int(math.sqrt(n))+1
。4恰好是CCD_ 5的平方根。int()
将该数字转换为整数,这意味着小数点后的任何数字都将被截断。if n%i == 0:
正在检查n
除以i
是否不包含余数,这意味着n
可以被i
整除。
第一个代码块和第二个代码块之间的返回语句的不同之处在于,第二个码块总是在第一个项目上返回,而在第一个码块中,只有在没有为任何项目返回False
的情况下,它才会返回True
。
您发布的代码用于测试奇数n
是否为素数。它通过测试3中的所有奇数来实现这一点,看看是否有奇数平分。
之所以使用math.sqrt(n)
,是因为可以均匀划分为一个数的最大素数是它的平方根,所以测试大于这个数没有意义。可能还有其他更大的因素,但它们将是已经测试过的较小数字的倍数。
第二个版本是不正确的,因为它一找到一个不等分为n
的数字就返回True
。但仍然可能有一个更大的数字可以划分为它。例如,如果n
是25
,它会返回True
,因为3
没有划分为它的部分。你需要遍历所有的潜在除数,如果没有划分为True
,只返回CCD_22。