leetcode 69 Sqrt(x)

实现开平方。

解决:

n分逼近

int mySqrt(int x) {
    int start = 0;
    int end = x;
    int64_t i;

    while (start < end) {
        i = start + ((end - start) >> 6) + 1;

        if (i * i == x)
            return i;
        else if (i * i > x)
            end = i - 1;
        else
            start = i;
    }
    return end;
}

牛顿迭代法:

int mySqrt(int x) {
    if (x <= 1)
        return x;
    int64_t r = x >> 1;

    while (r * r > x)
        r = (r + x / r) >> 1;
    return r;
}

牛顿迭代是求近似根的一种方法。

刚看到就想证明:

即若有:

r * r > x     (一)

[(r + x/r) / 2] ^ 2 < x

则:

[(r + x/r) / 2 + 1] ^ 2 > x

利用式(一)若干次放大缩小即可。

思考:

抛开数学不谈。

注意几个点:用64位整数做乘法比做除法快(除法也可ac);用移位做除法(解法一除多少都行,数字越大除越大越快接近)。

posted on 2018-01-23 11:04  willaty  阅读(123)  评论(0编辑  收藏  举报

导航