题解 | #求解立方根#
求解立方根
http://www.nowcoder.com/practice/caf35ae421194a1090c22fe223357dca
- 使用二分法,依次试错
- 最终可能两个值相等或差1,使用
right-left<=1
- 计算小数位1时,当超过大小时,说明上一个数和当前数为分界值
import java.util.Scanner;
/**
* class com.sloera.nowcoder
* user sloera
* date 2022/2/23
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextDouble()) { // 注意 while 处理多个 case
Double a = in.nextDouble();
boolean positive = false;
if (a < 0) {
positive = true;
a = -a;
}
double result = solve(a, 0, (int) (a + 1));
if (positive) {
result = -result;
}
System.out.printf("%.1f%n", result);
}
}
private static double solve(double a, int left, int right) {
if (right - left <= 1) {
for (int i = 1; i < 10; i++) {
final double rightRound = (left + i * 0.1) * (left + i * 0.1) * (left + i * 0.1);
if (rightRound > a) {
if (a - (left + (i - 1) * 0.1) * (left + (i - 1) * 0.1) * (left + (i - 1) * 0.1) > (rightRound - a)) {
return left + 0.1 * i;
} else {
return left + 0.1 * (i - 1);
}
}
}
return a;
}
int middle = (left + right) >> 1;
final int multi = middle * middle * middle;
if (multi == a) {
return middle;
} else if (multi < a) {
return solve(a, middle, right);
} else {
return solve(a, left, middle);
}
}
}