题解 | #求解立方根#

求解立方根

https://www.nowcoder.com/practice/caf35ae421194a1090c22fe223357dca

#include <iostream>
#include <math.h>
using namespace std;

float CubeRoot(string n) {
    uint64_t N = uint64_t(fabs(stof(n) * 1000000));
    string sn = to_string(N);
    auto len = sn.length();
    int sign = (stof(n) >= 0) ? 1 : -1;

    //小于0.05的立方根,四舍五入保留一位小数后,等于0.
    if (N < 125) {
        return 0.0;
    }

    int count = 0;
    uint64_t d;
    //if (len > 4)
    auto offset = (len - 1) / 3;
    uint64_t h = N / uint64_t(pow(10, 3 * offset));     //  h < 1000
    for (int i = 1; i < 10; i++) {
        count++;
        if (i * i * i > h) {
            d = i - 1;
            break;
        }
    }

    uint64_t a = d * uint64_t(pow(10, offset));
    uint64_t b = uint64_t(pow(10, offset + 1));
    while (1) {
        count++;
        auto i = (a + b) / 2;
        auto cube = i * i * i;
        if (cube > N) {
            b = i;
        } else if (cube < N) {
            a = i;
            if (a == (b - 1)) {
                d = a;
                break;
            }
        } else {
            d = i;
            break;
        }

        if (a == b) {
            d = a;
            break;
        }
    }

    //最后一位四舍五入
    uint64_t k = (d + 5) / 10;
    float  x = float(k / 10.0) * sign;

    //cout << d / 100.0 << endl;
    cout << x << endl;
    //cout << count << endl;

    return x;
}

int main() {
    string n;
    while (cin >> n) {
        CubeRoot(n);
    }

    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

投递腾讯等公司8个岗位
点赞 评论 收藏
转发
头像
05-12 09:14
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务