题解 | #HJ107 求解立方根#

求解立方根

http://www.nowcoder.com/practice/caf35ae421194a1090c22fe223357dca

import java.util.Scanner;

/**
 * HJ107 求解立方根 - 中等
 */
public class HJ107 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextDouble()) {
            double num = sc.nextDouble();
//            double x = method1(num);
            double x = Dichotomy(num);
            System.out.printf("%.1f", x);
        }
        sc.close();
    }

    /**
     * 1. 牛顿迭代法
     *
     * @param num
     * @return
     */
    private static double method1(double num) {
        double x = 1.0;
        double x1 = x + (num - x * x * x) / (3 * x * x);
        while (x - x1 > 0.000001 || x - x1 < -0.000001) {
            x = x1;
            x1 = x + (num - x * x * x) / (3 * x * x);
        }
        return x1;
    }

    /**
     * 二分查找法
     *
     * @param num
     * @return
     */
    private static double Dichotomy(double num) {
        double right, left, mid = 0.0;
        //一定要注意边界条件,输入的num可能是负数  将x<-1的边界范围定为[x,1],x>1的边界范围定为[-1,x]
        right = Math.max(1.0, num);
        left = Math.min(-1.0, num);
        while (right - left > 0.001) {
            mid = (left + right) / 2;
            if (mid * mid * mid > num) {
                //如果乘积大于num,说明立方根在mid的左侧
                right = mid;
            } else if (mid * mid * mid < num) {
                //如果乘积小于num,说明立方根在mid的右侧
                left = mid;
            } else {
                return mid;
            }
        }
        return right;
    }
}
全部评论

相关推荐

一表renzha:你点进去没打招呼他也会有提示的,之前我点进美的,还没打招呼,他马上给我发了不太合适哦
点赞 评论 收藏
分享
05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

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