题目来源:AcWing 790. 数的三次方根
一、题目描述
给定一个浮点数 n n n,求它的三次方根。
输入格式
共一行,包含一个浮点数
n
n
n。
输出格式
共一行,包含一个浮点数,表示问题的解。
注意,结果保留 6 6 6 位小数。
数据范围
−
10000
≤
n
≤
10000
−10000≤n≤10000
−10000≤n≤10000
输入样例:
1000.00
输出样例:
10.000000
二、算法思路
本质上是浮点数的二分,浮点数的二分比较重要的一个环节是确定搜索区间的左右边界。比如开根号用二分来实现,求根号 x x x,不能轻易的将搜索范围左右边界定义为 [ 0 , x ] [0, x] [0,x],因为当 x < 1 x<1 x<1 时,会出现无解的问题。如: 0.01 0.01 0.01 开根号是 0.1 0.1 0.1,超过了 0.01 0.01 0.01 的右区间,会出现无解的情况。如果真的出现 x x x 的范围 < 1 <1 <1 时,将边界设置为 [ 0 , m a x ( x , 1 ) ] [0, max(x, 1)] [0,max(x,1)]即可。
本题因为搜索空间比较大
[
−
10000
,
10000
]
[-10000, 10000]
[−10000,10000],包含了开三次方根在
x
<
1
x<1
x<1 的所有可能解,因此直接利用二分即可。
注意:本题要求结果保留
6
6
6 位小数,那么搜索区间必须搜索到
r
−
l
<
1
0
−
8
r - l < 10^{-8}
r−l<10−8 才可以停止,这是经验值。
三、代码
#include <iostream>
using namespace std;
int main()
{
double x;
scanf("%lf", &x);
double l = -10000, r = 10000;
while (r - l > 1e-8)
{
double mid = (l + r) / 2.0;
if (mid * mid * mid >= x) r = mid;
else l = mid;
}
printf("%lf\n", l);
return 0;
}
325

被折叠的 条评论
为什么被折叠?



