leetcode x 的平方根

实现 int sqrt(int 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,则有方程f(x)=x^{2}-a,方程的0根即为所求数的平方根。用牛顿-拉弗森方法解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。把f(x)x_{0}点附近展开成泰勒级数f(x)=f(x_{0})+{f}'(x_{0})(x-x_{0})+({f}''(x_{0})/2!)(x-x_{0})^{2}+... 取其线性部分,作为非线性方程f(x)=0的近似方程,即泰勒展开的前两项,则有f(x)=f(x_{0})+{f}'(x_{0})(x-x_{0})=0,设{f}'(x)\neq 0则其解为x_{1}=x_{0}-f(x_{0})/{f}'(x_{0})这样,得到牛顿法的一个迭代序列:x_{n+1}=x_{n}-f(x_{n})/{f}'(x_{n}),再代入f(x)=x^{2}-a,得到y的迭代公式:y_{n+1} = (x_{n}+a/x_{n})/2,然后就可以比较迭代出的值和目标值a的差是否满足精度范围。

class Solution {
    public int mySqrt(int x) {
        long res = x;
		while (res * res > x) {
			res = (res + x / res) / 2;
		}
        return (int)res;
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值