方法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满足方程
x2−a=0
,记
f(x)=x2−a
,问题转化为求
f(x)
和x轴的交点。
在
f(x)
上取一点
x0
,程序中即为
a
,过点
迭代公式: xn+1=xn−f(xn)f′(xn)
程序实现: xn+1=xn−x2n−a2∗xn=xn2+a2∗xn
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);
}
};