在不使用 sqrt(x) 函数的情况下,得到 x 的平方根的整数部分。
重点考察:二分法、牛顿迭代。
二分法:
public static int binarySearch(int x) {
int index = -1, left = 0, right = x; // 索引值、左边界、右边界
while (left <= right) {
int mid = left + (right - left) / 2;
if (mid * mid <= x) {
index = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
return index;
}
牛顿迭代:
假设 n 的平方根是 x,也就是 x * x= n,那么,n 和 n/x 都是 n 的因子,而且 n 必定是等于 n/x 的,也就是 n/x + x = 2 * x,也就是 x = (n/x + x)/2。
其中,x 可以选 0~n 中的任意值,如果满足 x = (n/x + x)/2,x 即为 n 的平方根,否则根据 x = (n/x + x)/2 得到的值进行递归循环,直至得到结果。
public static int newton(int n) {
if (n == 0 || n == 1) {
return n;
}
return (int) sqrt(n, n);
}
public static double sqrt(double i, int n) {
double res = (i + n / i) / 2;
if (res == i) {
return i;
} else {
return sqrt(res, n);
}
}