求x的平方根常见的是两种方法,一是二分查找,二是牛顿迭代法。
一、牛顿迭代法
y=x^2-C;要求C的平方根,只需求出y的零点(大于0);定义x0为旧零点,令x0的初始值为C,可求得(x0,x0^2-C)处的切线y=2x0*x-(x0^2+C),再求得新零点x1=(x0+C/x0)*0.5; 再令x0=x1,反复迭代直到x0-x1的误差足够小。x0即为所求结果。
tip1:x0不能为0,0不能做除数,故x=0特殊处理。
tip2: x0必大于x1,故不需要使用官方题解Math.abs(x0-x1);
public int mySqrt(int x) {
if(x==0)
return 0;
double C=x,x0=C;
while(true){
double x1=0.5*(x0+C/x0);
if(x0-x1<1e-7){
break;
}
else{
x0=x1;
}
}
return (int)x0;
}
二、二分查找算法 ,这里使用的是课本常见的二分查找模板。
tip1: x为int类型,mid*mid很有可能超出int的最大值2147483647,故强制转换为long;
tip2:当left==right时,mid=left=right;此时有两种情况:一种是mid的值正好是x的平方根 ,进入else 分支 left++,left>right返回 mid ------>right;另一种是mid*mid大于x,right--,题目要求不超过x,故返回right=mid-1;综上返回right。
public int mySqrt(int x) {
int left=1;
int right=x;
while(left<=right){
int mid=left+(right-left)/2;
if((long)mid*mid>x){
right=mid-1;
}
else{
left=mid+1;
}
}
return right;
}