题目
在不使用sqrt(x)函数的情况下,得到正整数x的平方根的整数部分。
重点考察:二分法、牛顿迭代。
例如:
输入:24
输出:4
输入:1
输出:1
一、思路
1.解法一(二分查找)
使用二分查找(元素必须有序),减少迭代次数。left表示左指针,right表示又指针,mid表示中间指针。
- 当mid指向的值的平方小于等于x时,将left右移,即left=mid+1;
- 当mid指向的值的平方大于x时,将right左移,即right=mid-1。
2.解法二(牛顿迭代)***
牛顿迭代的公式为(x/n+n)/2,将公式计算出来的值带入n重复计算,直到x/n==n。
二、代码
1.二分查找
代码如下(示例):
public static int binarySearch(int x){
int index = -1,left = 0,right = x;
while (left <= right){
int mid = (left + right) / 2;
if (mid * mid <=x){
index = mid;
left = mid + 1;
}else {
right = mid - 1;
}
}
return index;
}
2.牛顿迭代***
代码如下(迭代实现):
//牛顿迭代,迭代实现
public static int newton(int x){
double n = 1.0;
while ((int)(x / n) != (int)(n)){
n = (x/n + n) / 2;
}
return (int)(n);
}
代码如下(递归实现):
public static int newton1(int x){
return (int)sqrt(1,x);
}
public static double sqrt(double n,int x){
double res = (x/n + n)/2;
if (res == n){
return n;
}else {
return sqrt(res,x);
}
}