算法题:开根号

算法功底是程序员的灵魂,设计模式是程序员的骨架。


实现 int func(int n) 函数,或者int n换成double n

n整型时:假如返回类型是整数,结果只保留整数的部分,小数部分将被舍去;
n是double时,保留小数点后3位

(1)二分法求解(可以再优化)

public class Test02 {

	public static void main(String[] args) {
		// FIXME 这里用5来测试
		double N = 5;
		System.out.println(N + " 开根号保留三位小数后的值是:" + String.format("%.3f", func(N)));
	}

	static double func(double N) {
		double middle = 0;
		double left = 0;
		double right = N;

		// 这里以保留小数点后三位为例,保留小数点后三位对应的就是"1e-3"
		while (right - left > 1e-3) {
			// 第(1)步:middle = (left + right) / 2
			middle = (left + right) / 2;
			if (middle * middle < N) {
				// 第(2.1)步:如果middle * middle < N,说明middle太小,需要往右找,下一次让left = middle,跳到第(1)步
				left = middle;
			} else {
				// 第(2.2)步:如果middle * middle >= N,说明middle够大了,需要往左逼近,下一次让right=middle,跳到第(1)步
				right = middle;
			}
			// (3)直到right-left的差值精度在10的-3次方:1e-3,说明精度满足了"保留3位小数"的要求
			System.out.println("left:" + left + ",right:" + right + ",middle:" + middle);
		}

		return middle;
	}

}

运行结果:

left:0.0,right:2.5,middle:2.5
left:1.25,right:2.5,middle:1.25
left:1.875,right:2.5,middle:1.875
left:2.1875,right:2.5,middle:2.1875
left:2.1875,right:2.34375,middle:2.34375
left:2.1875,right:2.265625,middle:2.265625
left:2.2265625,right:2.265625,middle:2.2265625
left:2.2265625,right:2.24609375,middle:2.24609375
left:2.2265625,right:2.236328125,middle:2.236328125
left:2.2314453125,right:2.236328125,middle:2.2314453125
left:2.23388671875,right:2.236328125,middle:2.23388671875
left:2.235107421875,right:2.236328125,middle:2.235107421875
left:2.2357177734375,right:2.236328125,middle:2.2357177734375
5.0 开根号保留三位小数后的值是:2.236

(2)牛顿迭代法求解(待补充)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值