【问题标题】:Can someone explain to me how math.sqrt() work in this situtation?有人可以向我解释一下 math.sqrt() 在这种情况下是如何工作的吗?
【发布时间】:2020-10-19 20:18:11
【问题描述】:

如果 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

【问题讨论】:

  • “它是如何工作的”是什么意思?它计算 n 的平方根 - 这是它唯一要做的事情。
  • 第一个问题是什么?如果n 为4,则第二个将失败,当i 为3 时,它将输出True
  • 顺便说一句,如果你使用 Python >= 3.8,使用math.isqrt(n) 比使用int(math.sqrt(n)) 更好。

标签: python primes


【解决方案1】:

对于您的第一个代码块,range(3, int(math.sqrt(n))+1,2) 表示for 循环将从数字 3 开始,并包含所有其他数字,直到 int(math.sqrt(n))+1math.sqrt(n) 只是 n 的平方根。 int() 正在将该数字转换为整数,这意味着小数点后的任何内容都将被截断。 if n%i == 0: 正在检查 n 除以 i 是否包含余数,这意味着 n 可以被 i 整除。

您的第一个和第二个代码块之间的 return 语句的区别在于,第二个代码块将始终返回第一个项目,而在第一个代码块中,仅当 False 不是时它才会返回 True t 为任何项目返回。

【讨论】:

    【解决方案2】:

    您发布的代码用于测试奇数n 是否为素数。它通过测试 3 中的所有奇数来做到这一点,看看它们中是否有任何一个将其平均分配。

    math.sqrt(n) 之所以被使用,是因为可以将一个数整除的最大素因数是它的平方根,所以测试大于这个数的数字是没有意义的。可能还有比这更大的其他因素,但它们将是已经测试过的较小数字的倍数。

    第二个版本是不正确的,因为它一旦找到一个不均分到n 的数字就会返回True。但是仍然可能有更大的数字确实分成了它。例如,如果n25,它将返回True,因为3 没有划分为它。您需要遍历所有个潜在的除数,如果没有一个除数,则只返回True

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      相关资源
      最近更新 更多