题目描述
实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。
解题思路
看到这个题,当时想到了利用二分法,查找x的平方根。写出了如下代码
public int mySqrt(int x) {
if(x<0)
return -1;
if(x == 0 || x ==1)
return x;
int l = 1, h = x;
while(l < h ) {
int m = l + (h-l) /2;
if(m*m == x || (m * m < x && (m+1)*(m+1) >x)) {
return m;
}
else if(m * m > x || m*m <0) { //平方根比m小,取值为l到m-1,
h = m-1;
}else {
l = m+1;
}
}
return l;
}
但是这个方法并不适用大数,因为mm有可能会溢出,则得到的负数,因此加入判断条件(mm<0),但这依然有可能溢出太严重,变成了一个正数,因此想到利用除法或者将int类型转换为long计算,可以防止溢出,将上述代码转换为long改为:
public int mySqrt(int x) {
if(x<0)
return -1;
if(x == 0 || x ==1)
return x;
long l = 1, h = x;
long t = x;
while(l < h ) {
long m = l + (h-l) /2;
if(m*m == x || (m * m < x && (m+1)*(m+1) >x)) {
return (int)m;
}
else if(m * m > x) { //平方根比m小,取值为l到m-1,
h = m-1;
}else {
l = m+1;
}
}
return (int)l;
}
改为除法的代码:
public int mySqrt(int x) {
if (x <= 1) {
return x;
}
int l = 1, h = x;
while (l <= h) {
int mid = l + (h - l) / 2;
int sqrt = x / mid;
if (sqrt == mid) {
return mid;
} else if (mid > sqrt) {
h = mid - 1;
} else {
l = mid + 1;
}
}
return h;
}