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