分析:
本题为二分的应用。区间可设为 $−10000≤n≤10000$,这也说明了二分的本质不是单调,而是边界。浮点数二分,对于边界的要求较低。
首先根据 $l$ 和 $r$ 的中点 $mid$ 处的三次方和 $n$ 的大小来选择子区间进行逼近。
这里假设输入为 $8$,用图模拟下局部二分过程。
1.如果 $mid * mid * mid ≥ n$,则说明 $mid ≥ n$ 的三次方根,则应当在 $[l,mid]$ 的范围内继续逼近,故令 $r = mid$;
2.如果 $mid * mid * mid < n$,则说明 $mid < n$ 的三次方根,则应当在 $[mid,r]$ 的范围内继续逼近,故令 $l = mid$;
上面两部直至 $r - l < 10^{-8} $时结束(这里有一个问题就是如果结果保留 $k$ 位小数,这里就是 $10^{-(k+2)}$)。
C++ 代码中保留 $n$ 位小数需要加入头文件iomanip
,以及 cout << setprecision(n) << std::fixed << ...
。
代码(C++)
#include <iostream>
#include <iomanip>
using namespace std;
double mid, n;
double f(double x)
{
return x * x * x;
}
int main()
{
cin >> n;
double l = -1000, r = 1000;
while (r - l > 1e-8)
{
mid = (l + r) / 2;
if (f(mid) >= n) r = mid;
else l = mid;
}
cout << fixed << setprecision(6) << l;
}