我字体打的比较繁琐,但是我用我拙劣繁琐的文字,也解释了为啥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;
}