错误写法
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
double n;
scanf("%lf",&n);
double l=0,r=n,mid;
//这么写样例为0.001时错误的原因找的范围太小了,所以找不到,要给一个更大的范围.
while(r-l>1e-13){
mid=(l+r)/2;
if(mid*mid*mid>n){//找这么(1e-8)一个小边界的左值和右值都一样.
r=mid;
}else{
l=mid;
}
}
printf("%.6lf\n",l);
return 0;
}
错误原因分析
这样写会导致n为0.001时答案为0.001,答案不正确,原因如下,这么写只会在0-0.001之间找答案,可是正确答案不在这个范围内,所以最好把范围扩大一下,这个问题出在小于一的小数身上所以最好范围+1.再考虑到负数的情况,所以代码有以下改进.
AC代码
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
double a;
bool is=false;
cin >> a;
//在一个区间内找一个值,用二分.
//二分第一步,确定左右边界
//l 与 r
double l,r;
if(a < 0){
l = a - 1;
r = -a + 1;
}else{
l = -a - 1;
r = a + 1;
}
double mid;
while(r-l>1e-12){
mid=(l+r)/2;
//等于号怎么处理,小数的话应该是放哪边都行.
if(mid*mid*mid>a){
r=mid;
}else{
l=mid;
}
}
printf("%.6lf\n",l);
return 0;
}