面试题:实现一个开方函数

这是博主面试时遇到的一道真题,博主最熟悉的语言是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的方法,如果大佬们有更好的方法求告知!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值