题解 | #求解立方根#

求解立方根

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;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务