题解 | #求解立方根#
求解立方根
https://www.nowcoder.com/practice/caf35ae421194a1090c22fe223357dca
此题的难点主要在于:
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;
}
}
阿里云工作强度 616人发布
查看6道真题和解析