实现 int sqrt(int x)
函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4 输出: 2
示例 2:
输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
思路:
普通的二分法,二分的判断条件是 x/mid 和 mid的关系,为什么这么设置,因为要找的是平方根的近似,结合计算机中的除法是向下取整的,所以当(x/mid>=mid)时,说明方根一定在(mid,j]之中,反之则在[i,mid)之中.
class Solution {
public int mySqrt(int x) {
int i=1;
int j=x;
while (i<=j) {
int mid=i+(j-i)/2;
//x/mid=mid说明正好是平方根,但是“/”会向下取整,
//所以当x/mid >= mid 时,说明真正的平方根要大于mid
if(x/mid>=mid){
i=mid+1;
}else{
j=mid-1;
}
}
return j;
}
}
方法2:摘自https://blog.csdn.net/dawnbreak/article/details/3308413
牛顿-拉弗森法用来算平方根:设某数为p,则有方程,方程的0根即为所求数的平方根。用牛顿-拉弗森方法解非线性方程的牛顿法是把非线性方程线性化的一种近似方法。把在点附近展开成泰勒级数 取其线性部分,作为非线性方程的近似方程,即泰勒展开的前两项,则有,设则其解为这样,得到牛顿法的一个迭代序列:,再代入,得到的迭代公式:,然后就可以比较迭代出的值和目标值的差是否满足精度范围。
class Solution {
public int mySqrt(int x) {
long res = x;
while (res * res > x) {
res = (res + x / res) / 2;
}
return (int)res;
}
}