Sqrt(x) - LintCode

examination questions

Implement int sqrt(int x).

Compute and return the square root of x.

Example

sqrt(3) = 1

sqrt(4) = 2

sqrt(5) = 2

sqrt(10) = 3

Challenge

O(log(x))


解题代码

class Solution {
public:
    /**
    * @param x: An integer
    * @return: The sqrt of x
    */
    int sqrt(int x) {

        if (x == 1){
            return 1;
        }

        long long int temp = x / 2;
        int deposit;
        while (true){
            if (temp * temp > x){
                deposit = temp;
                temp = temp / 2;
            }
            else{
                if ((temp + 1)*(temp + 1) > x){
                    return temp;
                }
                else{
                    temp = (deposit + temp) / 2;
                }
            }
        }
    }
};

 

算法分析

使用二分法,给定一个要求的数,然后分半,若该数的平方大于给定的数,则对该数进行平分,如果平分后的平方小于给定的数,那么取该数与平分前的数的中数进行平方,每一次平方后如果该数是大于给定的数的,那么检测与该数小1的数的平方是否小于给定的数,如果是,那么该数为结果。

 

代码解析

class Solution {
public:
    /**
    * @param x: An integer
    * @return: The sqrt of x
    */
    int sqrt(int x) {

        if (x == 1){ //如果为1,那么直接得出结果
            return 1;
        }

        long long int temp = x / 2; //二分
        int deposit; //用于二分前的值,存放
        while (true){
            if (temp * temp > x){ //大于就二分
                deposit = temp; //存放
                temp = temp / 2; //二分
            }
            else{
                if ((temp + 1)*(temp + 1) > x){ //如果+1的平方大于x的话,那么就是该值
                    return temp;
                }
                else{
                    temp = (deposit + temp) / 2; //二分前与二分后的中值
                }
            }
        }
    }
};

 

posted @ 2015-05-28 19:20  TabWeng  阅读(484)  评论(0编辑  收藏  举报