Java机试题*:求解立方根不使用库函数(牛顿法公式 || 二分法)
方法一:牛顿迭代法
常量的导数是:0,指数的导数公式:
则根据迭代公式可得:x1 = x0 - f(x0) / 'f(x0) = x0- x03 - a / 3x02 = 2(x02 + a)) / 3
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); double num = Double.valueOf(bf.readLine()); double n = getCubeRoot(num); System.out.printf("%.1f",n); } private static double getCubeRoot(double num) { //判断输入是否为0 为0直接返回 if (num == 0) { return 0; } double x0 = num; // 根据迭代公式可得x1如下: double x1 = (2*x0 + num/(x0*x0))/3; // 迭代不满足条件x3 - a > 0.0001,即接近0,也可以表示为x1 - x0 > 0.0001,即x1和x0误差小余0.0001,基本相同 while (Math.abs(x1 - x0) > 0.0001) { x0 = x1; //更新x1 x1 = (2*x0 + num/(x0*x0))/3; } //最终结果 return x1; } }
方法二:二分法
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); double num = Double.valueOf(bf.readLine()); //double n = getCubeRoot(num); double x = Dichotomy(num); System.out.printf("%.1f",x); } // 使用类似二分的思路 public static double Dichotomy(double num) { double right , left, mid = 0.0; // 一定要注意边界条件,输入的num可能是负数,使用min(-1,) ,max(1,)扩大一点点范围来计算 right = Math.max(1.0,num); left = Math.min(-1.0,num);
// 结束条件,right和left基本相等,误差小雨0.001,所以返回左右都可以 while (right - left > 0.001) { mid = (left + right) / 2; // 如果乘积大于num,说明立方根在mid的左侧 if (mid * mid * mid > num) { right = mid; } // 如果乘积小于num,说明立方根在mid的右侧 else if (mid * mid * mid < num) { left = mid; } else {
// 若左右相等,就直接结束循环直接返回 return mid; } }
return right; } }
方法三:没有特殊要求下可以使用java库函数Math.pow()
pow() 方法可返回 x 的 y 次幂 (xy) 的值:
eg :Math.pow(4, 3); 求4的立方
开根号,就是写为分数:
eg :Math.pow(4, 1.0 / 3.0); 求4的立方根
参考链接:https://www.nowcoder.com/practice/caf35ae421194a1090c22fe223357dca?tpId=37&&tqId=21330&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking
参考链接:https://zhidao.baidu.com/question/277064910.html
参考链接:https://www.w3school.com.cn/jsref/jsref_pow.asp