zoukankan      html  css  js  c++  java
  • [编程题] lc [69. x 的平方根]

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

    题目

    image-20200730112228300

    方法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:牛顿迭代法

    公式推导

    image-20200730113911182

    代码

    //根据牛顿迭代法公式: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;
    }
    

    image-20200730114127611

  • 相关阅读:
    openCV中cvSnakeImage()函数代码分析
    程序所有重构,升级的目标(备注,更新)
    基础总结篇之中的一个:Activity生命周期
    Tomcat全攻略
    VRRP协议具体解释
    二叉树三种遍历(递归以及非递归实现)
    AssertValid函数学习
    java定时器的使用(Timer)
    循环队列
    使用Heartbeat实现双机热备
  • 原文地址:https://www.cnblogs.com/jiyongjia/p/13402905.html
Copyright © 2011-2022 走看看