本题是一个标准的浮点数二分查找模板题。
题目
题目链接
AcWing网站,https://www.acwing.com/problem/content/792/。
题目描述
给定一个浮点数n,求它的三次方根。
输入格式
共一行,包含一个浮点数n。
输出格式
共一行,包含一个浮点数,表示问题的解。
注意,结果保留6位小数。
样例输入
1000.00
样例输出
10.000000
数据范围
−10000 ≤ n ≤ 10000
分析
要求求输入数据的三次方根。
边界分析
从题目中知道,数据范围是 [-10000, 10000] 之间。因此我们可以得到如下结论:
1、左边界为 -10000。这个估计不会出错。
扫描二维码关注公众号,回复:
9573007 查看本文章
2、右边界不是 n,这点要注意。因为也就是数据有正有负。由于是求三次方根,要注意负数的三次方根数据会变大。比如 -1000 的三次方根为 -10;1000 的三次方根为 10。所以右边界应该为 10000。
精度
题目需要保留 6 位小数点数据,因此我们可以定义 double eps=1e-8; 即可。
检查函数
从题目可以知道,我们的检查函数就是判断 mid 的三次方和用户输入 n 的关系。函数实现如下:
bool check(double x, double n) {
return x*x*x>=n;
}
查找方法
这个比较简单,既然是浮点数二分查找,套用对应的浮点数二分查找模板即可。
AC 参考代码
#include <cstdio>
#include <cmath>
double check(double x, double n) {
return x*x*x>=n;
}
int main() {
double n;
scanf("%lf", &n);
double left = -10000;
double right = 10000;
double eps = 1e-8;
double mid;
while (fabs(left-right)>eps) {
mid = (right+left)/2;
if (true == check(mid, n)) {
right = mid;
} else {
left = mid;
}
}
printf("%.6lf\n", left);
return 0;
}