求一个整数x的平方根到指定精度[C++][Python]

这是一道经典的leetcode题目面试题目,题目如下:


一. 题目描述

LCR 072. x 的平方根

给定一个非负整数 x,计算并返回 x 的平方根,即实现 int sqrt(int x) 函数。

正数的平方根有两个,只输出其中的正数平方根。

如果平方根不是整数,输出只保留整数的部分,小数部分将被舍去。(后面我会补充一下使用牛顿法求到指定精度的例子)


下面的内容有很多参考自Leetcode对这个问题的官方题解

一. 求整形解

解法1: 袖珍计算器法(可以是高精度的)

利用如下的公式进行求解:

cpp 复制代码
class Solution {
public:
  // 袖珍计算器法
  int mySqrt(int x) {
    // sqrt(x) = exp(0.5*ln(x))
    if (0 == x) {
      return 0;
    }
    int res = exp(0.5 * log(x));
    if (pow(res + 1, 2) <= x) {
      return res + 1;
    }
    return res;
  }
};
python 复制代码
class Solution:
    # 袖珍计算器法
    def mySqrt(self, x: int) -> int:
        if 0 == x:
            return 0
        res:int = int(math.exp(0.5*math.log(x)))
        if pow(res+1, 2)<=x:
            return res+1
        return res

解法2: 二分查找法(只能取整)

cpp 复制代码
class Solution {
public:
  // 二分查找法
  int mySqrt(int x) {
    int l = 0, r = x, mid = -1, ans = -1;
    while (l <= r) {
      mid = l + (r - l) / 2;
      if (x < (long)mid * mid) {
        r = mid - 1;
      } else if (x == (long)mid * mid) {
        return mid;
      } else {
        l = mid + 1;
        ans = mid;
      }
    }
    return ans;
  }
};
python 复制代码
class Solution:
    def mySqrt(self, x: int) -> int:
        l:int = 0
        r:int = x
        ans:int = -1
        while l <= r:
            mid:int = l + (r-l)//2
            if x < mid*mid:
                r = mid-1
            elif x == mid*mid:
                return mid
            else:
                l = mid+1
                ans = mid
        return ans

解法3: 牛顿法(可以高精度)


cpp 复制代码
class Solution {
public:
  // 牛顿迭代法
  int mySqrt(int x) {
    if(0 == x){
      return 0;
    }
    int C = x;
    double x0 = x, xi;
    while(true){
      xi = 0.5 * (x0 + C/x0);
      if(fabs(xi-x0)<1e-7){
        break;
      }else{
        x0 = xi;
      }
    }
    return int(xi);
  }
};
python 复制代码
class Solution:
    def mySqrt(self, x: int) -> int:
        if 0 == x:
            return 0
        C:int = x
        x0:float = x
        xi:float
        while True:
            xi = 0.5 * (x0 + C/x0)
            if math.fabs(xi-x0)<1e-7:
                break
            else:
                x0 = xi
        return int(xi)

二. 求指定精度解

上面的这些输出的都是向下取整之后的整数根,如果想要输出指定精度位数的小数的话,需要对代码进行适当的一些修改。

解法1: 袖珍计算器法(可以是高精度的)

利用如下的公式进行求解:

cpp 复制代码
class Solution {
public:
  // 袖珍计算器法
  double mySqrt(int x, int n) {
    // sqrt(x) = exp(0.5*ln(x))
    if (0 == x) {
      return 0;
    }
    double res = exp(0.5 * log(x));
    if (pow(res + 1, 2) <= x) {
      return res + 1;
    }
    //不是四舍五入,是直接舍弃掉后面的
    res = (int)(res * pow(10, n)) / pow(10, n);
    return res;
  }
};
相关推荐
weixin1997010801627 分钟前
《二手ERP对接闲鱼API:聚石塔强制入塔后的架构重构实录》(附Python源码)
python
小白快快跑哦34 分钟前
python-字符串全解(六):正则表达式-转义与非转义
python·正则表达式·转义与非转义
晴天的雨.9921 小时前
【C++算法】和为s的两个数
开发语言·数据结构·c++·算法
IvanCodes6 小时前
Python 数据处理(十三):JSON、CSV 与数据序列化
开发语言·python
Patrick在香港7 小时前
Claude 工具调用返回空:8 次失败里只有 1 次状态码不对,其余全带 200
爬虫·python·api·claude·香港
Web3&Basketball7 小时前
CRM Agent 后训练实战:3 倍更少错误
python·架构·大模型·agent·推理
aramae8 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
AIFQuant8 小时前
ETF行情API接入踩坑记:从报错到跑通的七个问题
python·金融·区块链·etf·基金
GPU实战笔记10 小时前
云端 Python 开发:JupyterLab 还是 VS Code Remote-SSH?
python·vs code·jupyterlab·remote-ssh·远程开发
狗狗狗狗狗乐啊10 小时前
搭一个 AI 对话工作台 AChat:从 0 到可用的完整记录(一)
python·react.js·ai编程