Java中为我们提供了一个Math类,用来实现各种数学运算,极大的方便了日常开发,不过同时也让我们极少去关注这些运算的算法究竟是如何实现的,所以导致我们拿到一个求数学运算的方法的的算法题时候不知如何下手,今天有幸碰到一个算法题,有些收获。
题目是这样的:求一个数N(0 < N <= 100),设计一个算法求它的平方根,误差范围为e <= 0.01.
思路:实际上在Java中存在Math.pwd(double a, double b)这种运算帮我们来实现,如果要我我们自己来实现,该如何做了?
首先可以确定的是最终结果x的范围是0 < x < N 同时 N - e < x*x < N + e;我们可以通过二分法不断缩小这个范围,最终的结果就是我们所求的值,具体算法如下所示:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
while(cin.hasNext()) {
float N = cin.nextFloat();
float e = cin.nextFloat();
System.out.println(qart(N, e));
}
}
public static float qart(float N, float e) {
float x = 0;
if(0 <N && N <= 100 && 0 < e && e <= 0.01) {
float low = 0;
float high = N;
while(low < high) {
float mid = (low + high) / 2;
if(mid * mid < N - e) {
low = mid;
} else if(mid * mid > N + e) {
high = mid;
} else {
x = mid;
break;
}
}
}
return x;
}
}