此题的难点主要在于:

1.分析输入数字,可能为大于1,或者小于1的数字,则对应二分法的起始数字不同;可能为正数、或者负数,则更新首尾值不同;

2.如何判断该数字为立方根:取相邻+-0.1的数字,比较三者与input的差的绝对值,当该数字绝对值最小时,表示该数字为立方根;

3.根据差值的正负,更新二分法的首尾值(但是要注意,若input为负数,则可以转化为正数进行判断,输出时再加上负号)。

import java.util.*;
import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        double input = scan.nextDouble();
        double head = 0.0;
        double tail = Math.abs(input);
        double middle = input>1.0?(head + tail) / 2:1.0;



        while (true) {
            middle = new BigDecimal(middle).setScale(1,
                    BigDecimal.ROUND_HALF_UP).doubleValue();
            int result = f(input, middle);
            if (result == 0) {
                System.out.println(input > 0 ? middle : "-" + middle);
                break;
            } else {
                if (result == 1) {
                    head = middle;
                    middle = (head + tail) / 2;
                } else {
                    tail = middle;
                    middle = (head + tail) / 2;
                }
            }

        }

    }

    //判断是否为该参数立方根
    public static int f(double input, double middle) {
        double less = middle - 0.1;
        double more = middle + 0.1;
        double diff1 = Math.abs(input) - less * less * less;
        double diff2 = Math.abs(input) - middle * middle * middle;
        double diff3 = Math.abs(input) - more * more * more;
        if (Math.abs(diff2) < Math.abs(diff1) &&
                Math.abs(diff2) < Math.abs(diff3)) return 0;
        if (diff2 < 0) return -1;
        return 1;
    }
}