📜  整数的平方根(1)

📅  最后修改于: 2023-12-03 15:10:23.158000             🧑  作者: Mango

整数的平方根

整数的平方根是指能够恰好开平方得到整数的非负整数。例如,4的平方根为2,而5没有整数平方根。

在编程中,我们经常需要对整数进行平方根计算。本文将介绍几种常见的计算整数平方根的方法。

方法一:数学公式计算

根据数学公式,一个数的平方根可以通过牛顿迭代法计算。以下是一个示例代码片段,用于计算整数的平方根:

def sqrt(x: int) -> int:
    if x < 0:
        raise ValueError("Cannot calculate square root of negative number")
    if x == 0:
        return 0
    guess = x
    while True:
        next_guess = (guess + x // guess) // 2
        if abs(guess - next_guess) < 1:
            return next_guess
        guess = next_guess

在上面的代码中,我们从给定的整数开始猜测它的平方根。然后在每次迭代中,将目前的猜测值和原整数除以猜测值的商的平均值作为下一个猜测值。直到下一个猜测值和当前猜测值差小于1时,我们可以认为已经得到了整数的平方根。

方法二:二分查找

二分查找法可以在有序数组中查找某个元素,但是我们也可以将其用于查找整数的平方根。以下是一个示例代码片段,用于计算整数的平方根:

def sqrt(n: int) -> int:
  if n < 2:
    return n
  
  left, right = 1, n // 2
  while left <= right:
    mid = (left + right) // 2
    if mid ** 2 == n:
      return mid
    elif mid ** 2 < n:
      left = mid + 1
    else:
      right = mid - 1
  
  return right

上面的代码先处理了一些特殊情况。然后,我们将查找范围初始化为1和n // 2之间的所有数。在每次迭代中,将查找范围缩小到一半,然后根据平方数与目标数的大小关系更新左端点或右端点。如果找到了整数的平方根,则返回该数。如果没有找到,则返回查找范围的右端点。

方法三:暴力枚举

最简单的方法是通过逐一检查所有可能的平方值来查找整数的平方根。以下是一个示例代码片段:

def sqrt(n: int) -> int:
  i = 0
  while i * i <= n:
    i += 1
  return i - 1

在上面的代码中,我们从0开始逐一枚举可能的平方值,直到找到最大的平方值小于或等于目标整数的平方值。然后,我们返回该值的平方根减去1。

总结

以上是三种常见的计算整数平方根的方法。在实际编程中,可以根据具体情况选择合适的算法来实现。需要注意的是,当计算负数的平方根时,应该抛出ValueError异常。