LeetCode/x的平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被舍去 。

1. 暴力法

class Solution {
public:
    int mySqrt(int x) {
        for(int i=1;i<=x;i++){
            int val = x/i;//防止int溢出
            if(val==i) return i;
            else if(val<i) return i-1;
        }
        return 0;
    }
};

2. 二分法

在暴力法的基础上二分优化

class Solution {
public:
    int mySqrt(int x) {
        int left = 1; int right = x;
        int ans = 0;
        while(left<=right){//二分法
            int mid = (left-right)/2+right;//防止int溢出
            int val = x/mid;//防止溢出用除法
            if(val==mid) return mid;
            else if(val<mid)  right = mid-1;//
            else {left = mid+1; ans=mid;}//每次更新记录平方小于x的值
        }
        return ans;
    }
};

3. 牛顿迭代法

建立并求取下面方程的根$$f(x)=x^2-C$$
迭代公式为$$x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)}=\frac{x_k+\frac{C}{x_k}}{2}$$
初值取C

class Solution {
public:
    int mySqrt(int x) {
        if (x == 0) 
            return 0;
        double C = x, x0 = x;//x0初值取C
        while (true) {//迭代
            double xi = 0.5 * (x0 + C / x0);//迭代公式
            if (fabs(x0 - xi) < 1e-5) {//精度限制
                break;
            }
            x0 = xi;//更新x
        }
        return int(x0);//向下取整
    }
};
posted @ 2022-06-29 17:05  失控D大白兔  阅读(38)  评论(0编辑  收藏  举报