算法题:开根号_专注_每天进步一点点的博客-爱代码爱编程
算法功底是程序员的灵魂,设计模式是程序员的骨架。
实现 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)牛顿迭代法求解(待补充)