LeetCode 69. Sqrt(x)

方法1:二分法(AC)

class Solution {
public:
    int mySqrt(int x) {
        //二分法
        long long l=0,r=x;
        int count=0;
        while(l!=r){
            long long mid=(l+r)/2;//用long long整型,保证l+r不会溢出
            long long temp=mid*mid;
            if(temp>x)r=mid;
            else if(temp<x)l=mid;
            else return mid;
            if(r*r==x)return r;
            if(r-l==1)return l;//
            count++;
            //printf("%d\n",count);
            cout<<l<<' '<<r<<endl;
        }
        return r;
    }
};

方法2:牛顿法(AC)
方法推导:
假设需要求数a的平方根x,则 x满足方程 x2a=0 ,记 f(x)=x2a ,问题转化为求 f(x) 和x轴的交点。
f(x) 上取一点 x0 ,程序中即为 a ,过点(x0,f(x0))的切线方程为 y=f(x0)+f(x0)(xx0) ,这条切线与x轴的交点为 (x0f(x0)f(x0),0) ,记为 (x1,0) ,则 x1 就是所要求的a的平方根x的1次近似。

迭代公式: xn+1=xnf(xn)f(xn)

程序实现: xn+1=xnx2na2xn=xn2+a2xn

class Solution {
public:
    int mySqrt(int x) {
        //牛顿梯度法
        double pre=0;
        double cur=x;
        int count=0;
        while(abs(cur-pre)>=1){
            pre=cur;
            cur=pre/2+x/(2*pre);
            count++;
            //printf("%d\n",count);
        }
        return int(cur);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值