【AcWing】790. 数的三次方根题解 浮点数二分法
目录
题目描述
给定一个浮点数 n,求它的三次方根。
输入格式
共一行,包含一个浮点数 n。
输出格式
共一行,包含一个浮点数,表示问题的解。
注意,结果保留 6 位小数。
数据范围
−10000≤n≤10000
输入样例
1000.00
输出样例
10.000000
解题思路
逆向思维,题目求n的三次方根m,我们用m反过来找m的三次方是否为n。
具体方法为浮点数二分法:
首先要确定二分的范围,本题的范围是 −10000≤n≤10000 ,故而设左端点l = -10000, 右端点 r = 10000;mid为二分的中点。
若mid^3 >= n,说明mid大于或等于n的三次方根,n的范围缩小到[ l , mid ],更新r = mid;否则n的范围缩小到( mid , r ],更新l = mid。当l和r差距小于10^-8时,此时的l满足了题目的精度要求,可视为n的三次方根进行输出。
*注意
1.涉及到小数点问题,我们一般取精度更高的double类型而不是float类型。
2.当题目要求的精度是小数点后m位时,我们计算要算到小数点后m+2位,这样更保险。
AC代码
//浮点数二分法
#include<bits/stdc++.h>
using namespace std;
double n;
int main()
{
scanf("%lf", &n);
double l = -10000, r = 10000;
while(r - l > 1e-8) //题目要求保留6位 保险起见我们就多保留两位保留8位
{
double mid = (l + r) / 2;
if(mid * mid * mid >= n) r = mid;
else l = mid;
}
printf("%lf", l); //%lf默认保留到小数点后6位置
return 0;
}