此题的难点主要在于:
1.分析输入数字,可能为大于1,或者小于1的数字,则对应二分法的起始数字不同;可能为正数、或者负数,则更新首尾值不同;
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;
}
}