题解 | #求解立方根#
求解立方根
http://www.nowcoder.com/practice/caf35ae421194a1090c22fe223357dca
二分法搜索解,注意处理负数和小数。
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; }