题目描述:

实现 int sqrt(int x) 函数,计算并返回 x 的平方根。

样例

sqrt(3) = 1

sqrt(4) = 2

sqrt(5) = 2

sqrt(10) = 3

 

题解:

解法1:

/// 解法1: O(sqrt(n))
class Solution {
public:
    /**
     * @param x: An integer
     * @return: The sqrt of x
     */
    int sqrt(int x) {
        // write your code here
        for (int i=0; i*i<=x; ++i) {
            long long temp = (long long)(i+1)*(i+1);
            if (temp > x) {
                return i;
            }
        }
    }
};

解法2:

二分

///解法2: O(log(n))

class Solution {
public:
    /**
     * @param x: An integer
     * @return: The sqrt of x
     */
    int sqrt(int x) {
        // write your code her
        int l = 1;
        int r = x / 2 + 1; //  ans >= 1 && ans <= x/2 + 1
        while(l <= r) {
            long long mid = (l + r) / 2;
            long long t1 = mid * mid;
            long long t2 = (mid + 1) * (mid + 1);
            if (t1 == x || (t1 < x && t2 > x)) return mid;
            if (t1 < x) {
                l = mid + 1;
            }else r = mid - 1;
        }
    }
};

 

解法3:

牛顿迭代法

///解法3: 牛顿迭代法
/* f(x) = n - x * x
 * Xi+1 = Xi - f(Xi)/f'(Xi)
 * Xi+1 = Xi - (n - Xi*Xi)/(-2*Xi)
 * Xi+1 = (Xi + n / Xi) / 2
 */

class Solution {
public:
    /**
     * @param x: An integer
     * @return: The sqrt of x
     */
    int sqrt(int x) {
         write your code her
        if (x == 0) return 0;
        double l = 0;
        double r = 1;
        while(l != r) {
            double t = r;
            l = (r + x*1.0 / r) / 2.0;
            r = l;
            l = t;
        }
        return (int) l;
    }
};

参考链接:

https://zh.wikipedia.org/wiki/%E7%89%9B%E9%A1%BF%E6%B3%95

http://www.cnblogs.com/AnnieKim/archive/2013/04/18/3028607.html

 

 

 

posted on 2017-01-25 22:39  小小八  阅读(814)  评论(0编辑  收藏  举报