题解 | #求解立方根#

求解立方根

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);
    }
  }
}
全部评论

相关推荐

每晚夜里独自颤抖:这个在牛客不是老熟人了吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务