版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bqw18744018044/article/details/89018692
-
题目描述
计算并返回x的平方根,其中x是非负整数。由于返回类型是整数,结果只保留整数部分,小数部分将被舍去。
-
思路
- 方法一
由于sqrt(x)的值不会超过x/2+1,因此可以在这个范围内进行二分搜索。
- 方法二
使用牛顿迭代法求解。假设我们希望求得的值,相当于求解方程。那么就可以使用牛顿迭代法来逐步逼近这个解。
首先,任选一个点,在该点对进行泰勒展开,得到
其中可以看做是对的线性近似,令得到的0点要比更加接近的解。因此令
化简得
将和代入上式得到
因此迭代的下一个位置
-
C++实现
- 方法一
int mySqrt(int x){ long long l = 0; long long h = x/2 + 1; while(l<=h){ long long mid = (l+h)/2; long long sq = mid*mid; if(sq==x)return mid; else if(sq<x)l = mid+1; else h = mid - 1; } return h; }
- 方法二
int mySqrt(int x){
if(x<=1)return x;
int r = x>>1;
//当r*r>x时,说明还没有得到解(这里用r>x/r是为了防止计算r*r溢出)
while(r>x/r){
r = (r+x/r)>>1;
}
return r;
}