实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
牛顿迭代法
比如136161这个数字,首先我们找到一个和136161的平方根比较接近的数,任选一个,比方说300到400间的任何一个数,这里选350,作为代表。
我们先计算0.5(350+136161/350),结果为369.5。
然后我们再计算0.5(369.5+136161/369.5)得到369.0003,我们发现369.5和369.0003相差无几,并且369²末尾数字为1。我们有理由断定369²=136161。
一般来说,能够开方开的尽的,用上述方法算一两次基本结果就出来了。再举个例子:计算 。首先我们发现600²<469225<700²,我们可以挑选650作为第一次计算的数。即算0.5(650+469225/650)得到685.9。而685附近只有685²末尾数字是5,因此685²=469225。
public int mySqrt(int x) {
//牛顿迭代法,结果为整数,即所求精度为<1
double m=1;//根,初始值为一
double check=2;//当前精度
while ((check>0?check:-check)>1){
m=(x/m+m)/2;
check=m*m-x;
}
return (int)m;
}
二分查找
int left=1;
int right=x;
int mid=(left+right-1)/2;
while(left<=right){
if((long)mid*mid-x<=0){//避免乘积过大超出int范围
left=mid+1;
}
else {
right=mid-1;
}
mid=(left+right)/2;
}
return mid;