注意:数据更新了
数的三次方根
题目
给定一个浮点数n,求它的三次方根。
输入格式
共一行,包含一个浮点数n。
输出格式
共一行,包含一个浮点数,表示问题的解。
注意,结果保留6位小数。
数据范围
−10000 ≤ n ≤ 10000
输入样例:
1000.00
输出样例:
10.000000
代码一:
#include<iostream>
using namespace std;
int main()
{
double digit , l , r;
cin>>digit;
//这里是范围的设置,注意一点,当digit = 0.001 的时候,三次方根为0.1 , 因此正确答案不在[0.0 , 0.001]中
//而是在[0.0 , 1.0]之间,因此需要注意范围的设置
if(digit >= 1 ) l = 1.0 , r = digit;
else if(digit <= -1 ) l = digit , r = -1.0;
else if(0 <= digit && digit <= 1) l = 0.0 , r = 1.0;
else if(-1.0 <= digit && digit <= 0.0 ) l = -1.0 , r = 0.0;
while(r - l > 1e-8)
{
double mid = (l + r) / 2;
if(mid*mid*mid > digit) r = mid;
else l = mid;
}
printf("%lf",l);
return 0;
}
注意事项:
1、当要求取到小数点后面6位的时候,一定要先求到后8位,然后四舍五入
2、在定义 l 和 r 的时候一定要尽量缩小二者的范围,以及正确答案是否在合理范围内
例如:根据题目意思,定义l = -10000,r = 10000; 结果错误。应当定义为 l = 1.0 , r = 10000;
例如:digit == 0.001 , 那么正确答案易得为0.1 ,但是0.1 不在[0.0 , 0.001]里面,因此需要特殊设置范围
范围设置
数据 , 范围
digit >= 1.0 , [1.0 , digit]
0.0 <= digit <= 1.0 , [0.0 , 1.0]
-1.0 <= digit <= 0.0 , [-1.0 , 0.0]
digit <= 1.0 , [digit , -1.0]
代码二:可以固定循环次数k
#include<iostream>
using namespace std;
int main()
{
double digit , l , r;
cin>>digit;
if(digit >= 1 ) l = 1.0 , r = digit;
else if(digit <= -1 ) l = digit , r = -1.0;
else if(0 <= digit && digit <= 1) l = 0.0 , r = 1.0;
else if(-1.0 <= digit && digit <= 0.0 ) l = -1.0 , r = 0.0;
int k = 1e5;
while(k--)
{
double mid = (l + r) / 2;
if(mid*mid*mid > digit) r = mid;
else l = mid;
}
printf("%lf",l);
return 0;
}
这里的k是根据时间复杂度求出来的,估算while里面的时间复杂度,假设为10^2,那么c++最多执行10^7次
那么 10^7 / 10 ^2 = 10^5 , 因此这里k = 10^5
大佬牛逼,数据加强过后我就想不明白了hhh