69.求x的平方根

求x的平方根常见的是两种方法,一是二分查找,二是牛顿迭代法。

       一、牛顿迭代法

                    y=x^2-C;要求C的平方根,只需求出y的零点(大于0);定义x0为旧零点,令x0的初始值为C,可求得(x0,x0^2-C)处的切线y=2x0*x-(x0^2+C),再求得新零点x1=(x0+C/x0)*0.5; 再令x0=x1,反复迭代直到x0-x1的误差足够小。x0即为所求结果。

                tip1:x0不能为0,0不能做除数,故x=0特殊处理。

                tip2: x0必大于x1,故不需要使用官方题解Math.abs(x0-x1);

  public int mySqrt(int x) {
        if(x==0)
            return 0;
        double C=x,x0=C;
        while(true){
            double x1=0.5*(x0+C/x0);
            if(x0-x1<1e-7){
                break;
            }
            else{
                x0=x1;
            }
        }
        return (int)x0;
    }

     二、二分查找算法 ,这里使用的是课本常见的二分查找模板。

               tip1: x为int类型,mid*mid很有可能超出int的最大值2147483647,故强制转换为long;

               tip2:当left==right时,mid=left=right;此时有两种情况:一种是mid的值正好是x的平方根 ,进入else 分支 left++,left>right返回 mid ------>right;另一种是mid*mid大于x,right--,题目要求不超过x,故返回right=mid-1;综上返回right。

       public int mySqrt(int x) {
        int left=1;
        int right=x;
        while(left<=right){
         int mid=left+(right-left)/2;
         if((long)mid*mid>x){
             right=mid-1;
         }
         else{
             left=mid+1;
         }
        }
    return right;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值