有人能向我解释一下mathem.sqrt()在这种情况下是如何工作的吗



如果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。但仍然可能有一个更大的数字可以划分为它。例如,如果n25,它会返回True,因为3没有划分为它的部分。你需要遍历所有的潜在除数,如果没有划分为True,只返回CCD_22。

最新更新