前言
经过前期的数据结构和算法学习,开始以OD机考题作为练习题,继续加强下熟练程度。
描述
计算一个浮点数的立方根,不使用库函数。
保留一位小数。
数据范围:∣𝑣𝑎𝑙∣≤20 ∣val∣≤20
输入描述:
待求解参数,为double类型(一个实数)
输出描述:
输出参数的立方根。保留一位小数。
示例1
输入:
19.9
输出:
2.7
实现原理与步骤
牛顿迭代法(Newton-Raphson Method)是一种用于求解非线性方程的数值方法。本题刚好适用。当然还有二分法,不过优先熟练一种解题方法即可。
牛顿迭代法基本原理
对于一个函数 f(x),我们希望找到 f(x)=0 的根。顿迭代法的迭代公式如下
其中:
- xn 是当前的近似值。
- xn+1 是下一个近似值。
- f′(x) 是 f(x) 在xn处的导数。
求解立方根的牛顿迭代法
实现代码
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
double y=in.nextDouble();
double x=cubeRoot(y);
System.out.println(String.format("%.1f", x));
}
public static double cubeRoot(double y){
if(y==0){
return 0;
}
double x=y/3.0;
double epsilon = 0.01; // 精度要求
while(Math.abs(x*x*x-y)>epsilon){
x = (2 * x + y / (x * x)) / 3.0;
}
return x;
}
}