我字体打的比较繁琐,但是我用我拙劣繁琐的文字,也解释了为啥l-r>0.0001,为啥midmidmid>num的时候要r=mid,为啥midmidmid 这道题按照二分法来做 而后在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与-1比最小,与1比最大 得出一个范围较大的边界public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextDouble()) { // 注意 while 处理多个 casedouble 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)