给定一个浮点数n,求它的三次方根。
输入格式
共一行,包含一个浮点数n。
输出格式
共一行,包含一个浮点数,表示问题的解。
注意,结果保留6位小数。
数据范围
−10000≤n≤10000−10000≤n≤10000
输入样例:
1000.00
输出样例:
10.000000
这道题和之前的leetcode上的题目的不同在于leetcode上的题目的输入都是整数,而这道题的输入范围是[-10000,10000] 这样对于二分的左右边界的初始值就会不同。
leetcode上的题目的左右边界是l = 0,r = num (num是输入的值),但是Acwing上的题目就不行了,举个例子假如左右边界l,r还是保存这种值0,num的话,
如果输入值是0.001,题目要求其3次方根,二分的初始化边边界是[0,0.001],然而我们知道0.001的3次方根是0.1,而0.1不在[0,0.001]中,利用二分查找是不可能找出的,因为二分是逐渐的缩小搜索区间。
# include<iostream>
# include<cmath>
using namespace std;
int main(){
double num;
cin>>num;
double l = -10005; // 直接赋值左右边界为输入边界,这样就不会出现正确值跳出初始区间的情况了。
double r = 10005;
while(abs(r-l)> 0.0000001){
double mid = (l+r)/2;
if (mid*mid*mid < num ) l = mid; // 别这样写 mid*mid < num/mid ,因为mid可能为0
else r = mid;
}
printf("%.6f",l);
return 0;
}