重点考察二分法、牛顿迭代
暴力破解当然可以。从2——x-1一个一个试验就可以了。这里不写了
二分法建立在暴力的基础之上,利用二分查找可以降低时间复杂度到对数级别。通过不断缩小判断区间锁定平方根
对于牛顿迭代,首先我们设一个数字x,其平方根为n。也就是n^2=x。这个式子等价于n=x/n。我们这样考虑:假定x是12,他有其中一组因子2,6.将其类比为x的一组因子x/n和n。虽然我们不知道他们谁更大谁更小。但是我们可以看出:这一组因子都离根号12比较远,而(2+6)/2也就是这一组因子的均值是比这一组因子更加接近根号12的,根据这个思路,我们利用递归思想找到根号12.
上代码:
public class SqrtX {
/**
* 二分
* @param x
* @return
*/
public static int binarySearch(int x) {
int index = -1;
int left = 0;
int right = x;
while (left <= right) {
int mid = (left + right) / 2;//取中间
if (mid * mid <= x) {
index = mid;//关键,只要找到了就可以存进来了,后续判断会跳出循环。
left = mid + 1;//如果小了,说明查找范围要变成mid+1——right中。
} else {
right = mid - 1;//如果大了,说明查找范围要变成left——mid-1中
}
}
return index;
}
/**
* 牛顿迭代
* @param x
* @return
*/
public static int newton(int x){
if (x==0){
return 0;
}
return (int)sqrt(x,x);//这个x可以自己猜一个,设为x也行。
}
public static double sqrt(double i,int x){
double res = (i+x/i)/2;
if (res==i){
return i;
}else {
return sqrt(res,x);
}
}
public static void main(String[] args) {
System.out.println(binarySearch(48));
System.out.println(newton(48));
}
}
结果:
6
6