1. 题目说明
2. 题目解析
浮点数二分比较简单,没有整数二分那么多的边界问题。但是有几个小点需要注意:
- 浮点数不可判等,精度问题。
- 若最后输出希望保留
n
位小数时,一般将精度设置为1e(-n-2)
位,即总是比小数多两位即可,这是一个经验值。如保留6位小数,则精度可设为1e-8
- 也可以直接
for
直接循环100
次,可以直接得到答案。
模板代码如下:
// 浮点数二分成熟模板
bool check(double x) {/* ... */} // 检查x是否满足某种性质
double bsearch_3(double l, double r)
{
const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求
while (r - l > eps)
{
double mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid;
}
return l;
}
问题代码如下:
#include <iostream>
using namespace std;
const double eps = 1e-8;
double n;
int main() {
scanf("%lf", &n);
int flag = 1;
if (n < 0) n = -n, flag = -1;
double l = 0, r = n;
while (r - l > eps) {
double mid = (l + r) / 2;
if (mid * mid * mid >= n) r = mid;
else l = mid;
}
printf("%.6lf", l * flag);
return 0;
}