这是博主面试时遇到的一道真题,博主最熟悉的语言是java,在一看到这道题目的时候不就是Math.sqrt(num)就解决了吗?当然,这种方式面试肯定是不可以的了,需要去手动实现。当时是一脸懵逼,开方咋算??不会啊!!后来面试官提示说可以找一个数求平方看看是不是和要求的数相等。。。懂了,开始写。。。
一、java中Math.sqrt(num)的实现方式
面试完后感觉自己写的不是特别好,于是就想看看java是怎么实现的,一看发现是这样的:
public static native double sqrt(double a);
是一个native方法,得了,也懒得去看了。
后来百度发现了一种方法:
二、采用 牛顿迭代法
https://www.cnblogs.com/hezhiyao/p/7544593.html
看了以后也不太懂什么是牛顿迭代法,反正我面试这种方法肯定是想不出来的,还是用我比较low的方法吧
三、二分法的思路
import java.math.BigDecimal;
public class Sqrt {
private static final double PRECISION = 6;
public static double sqrt(double num) throws RuntimeException{
if(num < 0){
throw new RuntimeException("num should bigger than 0!");
}
if(num == 0 || num == 1){
return num;
}
return sqrt0(0, num, num);
}
private static double sqrt0(double low, double high, double num){
double mid = (low + high) / 2;
BigDecimal bd = new BigDecimal(mid);
if(bd.precision() >= PRECISION){
return mid;
}
if((mid * mid) == num){
return mid;
}else if((mid * mid) < num){
return sqrt0(mid, high, num);
}else {
return sqrt0(low, mid, num);
}
}
public static void main(String[] args) {
System.out.println(sqrt(2));
}
}
当时面试的时候没有考虑精度的问题,算是敷衍过去了,但是下来自己重新写的时候才发现精度也不是那么好求的。。。经过一番百度发现了BigDecimal的方法,如果大佬们有更好的方法求告知!