二分法搜索解,注意处理负数和小数。
include <iostream>
using namespace std;
float float_min(float a, float b) {
if (a >= b) {
return b;
} else {
return a;
}
}
float float_max(float a, float b) {
if (a <= b) {
return b;
} else {
return a;
}
}
float solve(float num) {
// 注意num绝对值小于1时,搜索范围为-1~0或者0~1
float sign = (num > 0)? 1 : -1;
float limit = (abs(num) > 1)? abs(num) : 1;
limit = sign * limit;
// num绝对值大于1时,搜索范围为num ~ 0 或者 0 ~ num
float start=float_min(0, limit);
float end=float_max(0, limit);
while(end - start > 0.001) {
float mid = (start + end) / 2;
if (mid * mid * mid > num) {
end = mid;
} else {
start = mid;
}
}
return (start + end) / 2;
}
int main() {
float num;
while(cin >> num) {
printf("%.1f\n", solve(num));
}
return 0;
}
京公网安备 11010502036488号