题目来源:LintCode
原题地址:http://www.lintcode.com/zh-cn/problem/sqrtx/
题目:
实现 int sqrt(int x)
函数,计算并返回 x 的平方根。
Yes
样例
sqrt(3) = 1
sqrt(4) = 2
sqrt(5) = 2
sqrt(10) = 3
挑战
O(log(x))
难度级别:
容易
思路分析:
这道题需要我们求一个整数的平方根,更准确的说是平方根的向下取整的整数,
可以采用二分法来进行求解;
需要注意的是,可能结果并不是待求整数的数学平方根
,
所以,在进行区间迭代的时候,是要引起注意的,有可能待求数的平方根是介于两个整数之间的,
这种情况需要做一下判断处理,否则会陷入死循环中。
实现代码:
class Solution
{
public:
/**
* @param x: An integer
* @return: The sqrt of x
*/
int sqrt(int x)
{
// write your code here
if (x == 0)
{
return 0;
}
int left = 1, right = 46341;
int mid = 0;
while (left < right)
{
//cout << mid << endl;
if (mid == (left + right) / 2)
{
break;
}
mid = (left + right) / 2;
if (mid*mid == x)
{
return mid;
} else if (mid*mid < x)
{
left = mid;
} else
{
right = mid;
}
}
return mid;
}
};
代码说明:
在实现代码中,我才用了一个判断语句块来对平方根介于两个整数之间这种情况进行处理。
即如果中间值与左右边界的和的一半是相等的,那么现在的中间值就是上一循环中已经使用过的,也就是不需要
再进行迭代计算了。同时此时的中间值,也是最接近平方根的整数值。