浮点数二分查找模板题(数的三次方根)题解

本题是一个标准的浮点数二分查找模板题。

题目

题目链接

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;
}
发布了203 篇原创文章 · 获赞 101 · 访问量 104万+

猜你喜欢

转载自blog.csdn.net/justidle/article/details/104527896