首页 > 其他 > 详细

[编程题] lc [69. x 的平方根]

时间:2020-07-30 12:59:58      阅读:62      评论:0      收藏:0      [点我收藏+]

[编程题] 69. x 的平方根

题目

技术分享图片

方法1:二分法

Java代码

public static int sqrt(int x) {
        if(x==0 || x==1){return x;}
        int l=0;
        int  r=x;
        int res=-1;
        while (l<=r){
            int m = (l+r)/2;
            if(m == x/m) {
                return m;
            }
            else if(m>x/m) {
                r = m-1;
            } else{
                l = m+1;
                res = m;  //解释:为什么时刻在这里记录m是因为我们舍弃了小数部分,只有m*m<x的情况符合我们需要的m
            }
        }
        return res;
}

方法2:牛顿迭代法

公式推导

技术分享图片

代码

//根据牛顿迭代法公式:x(n+1) = (xn+y0/xn)/2
public static int mySqrt3(int x) {  //如果我们要精确计算值也可以把返回值改为double即可
    long r = x; //r*r会越界,这里用long
    while (r*r>x){
        r = (r+x/r)/2;
    }
    return (int)r;
}

我们计算出需要的指定精度的确切值

方法1:二分法
public static double sqrt2(int x) {
        if(x==0 || x==1){return x;}
        double l=0;
        double r=x;

        double res=-1;
        while (r-l>=1e-9){  ////这里是精度判断的退出条件
            double m = (l+r)/2;
            if(m == x/m) {
                return m;
            }
            else if(m>x/m) {
                r = m-1e-9;  //这里是每次减去精度
            } else{
                l = m+1e-9; //这里是每次减去精度 
                res = m;  //解释:为什么时刻在这里记录m是因为我们舍弃了部分精确值,只有m*m<x的情况符合我们需要的m
            }
        }
        return res;
}

方法2:牛顿迭代法

//根据牛顿迭代法公式:x(n+1) = (xn+y0/xn)/2
    public static double sqrt3(int x) {
        double r = x;
        while (r*r>x){
            r = (r+x/r)/2;
        }
        return r;
}

技术分享图片

[编程题] lc [69. x 的平方根]

原文:https://www.cnblogs.com/jiyongjia/p/13402905.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!