LeetCode 第 69 題 (Sqrt(x))

liyuanbhu發表於2016-04-23

LeetCode 第 69 題 (Sqrt(x))

Implement int sqrt(int x).
Compute and return the square root of x.

求 x 的平方根。我們知道 x

\sqrt{x}
是單調增函式, 1xx
1 \leq \sqrt{x} \leq x
。所以可以用二分查詢法來計算。

int mySqrt(int x)
{
    if(x <= 0) return 0;
    int a1 = 1;
    int a2 = 46341 * 2 - 1;
    unsigned int a, y;
    if(a2 > x / 2) a2 = x;
    do
    {
        a = (a1 + a2) / 2;
        y = a * a;
        if(y == x) return a;
        if(y > x)
        {
            a2 = a;
        }
        else
        {
            a1 = a;
        }
    }while(a1 + 1 < a2);
    a = (a1 + a2) / 2;
    return a;
}

這個程式比較講究的地方是 a2 = 46341 * 2 - 1 。之所以這麼去是為了使第一次迴圈時 a = (a1 + a2) / 2 = 46341。

46341 是個比較特殊的數,463412

46341^2
大於 INT_MAX 的最小的整數的平方數。這樣可以保證這個二分查詢法能覆蓋所有整數範圍,並且保證迴圈次數是最少的。

相關文章