HJ107 求解立方根(java详解,二分法详解)

我字体打的比较繁琐,但是我用我拙劣繁琐的文字,也解释了为啥l-r>0.0001,为啥midmidmid>num的时候要r=mid,为啥midmidmid<num的时候要l=mid

这道题按照二分法来做
首先让输入的数字num与-1比最小,与1比最大 得出一个范围较大的边界

而后在l-r>0.0001的条件下不断循环,直到l-r<=0.0001(这给误差可能很多人不太明白为啥要设置成0.00001,其实就是为了让l与r相近 也就让后面midmidmid=num的时候,mid=l或者mid=r都可以,相差也就是0.0001 后面又要四舍五入到小数点1位 所以你也可以设置成0.001 0.000001都可以嘛)

重点来了::::::让mid=(l+r)/2, 当midmidmid>num的时候 说明选取的区间[l,r]过大,那么减小区间,也就是r=mid 当midmidmid<num的时候 说明选取的区间[l,r]过小,那么增大区间,也就是l=mid
循环mid=XXX 直至midmidmid==num 这时候输出l 或者r 或者mid 都无所谓了 因为之前有条件l-r<=0.0001这个嘛 误差也不大

解释完毕

代码如下

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextDouble()) { // 注意 while 处理多个 case
            double a = in.nextDouble();
            System.out.println(String.format("%.1f",ss(a)));
        }
    }

    public static double ss(Double a){
        double l=Math.min(-1,a);
        double r=Math.max(1,a);
        double mid=0.0;
        while (r-l>0.0001){//这里可能很多人不懂,这个只是为了,后面mid==a时候,让mid=left,mid=right都无所谓
            mid=(l+r)/2;
            if(Math.pow(mid,3)>a){//说明区间过大了,需要减小区间,所以减小右边界
                r=mid;
            }else if (Math.pow(mid,3)<a){//说明区间过小了,需要扩大区间,增大左边界
                l=mid;
            }else{
                mid=l;
            }
        }

        return mid;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值