int Sqrt(int x )
{
if(x < 2)
return x;
int left = 1, right = x / 2, mid = 0;
while(left <= right)
{
mid = (left + right) / 2;
if(x / mid == mid)
return mid;
else {
if (x / mid < mid)
right = mid - 1;
else
left = mid + 1;
}
}
return right;
}
1. 用 x/ mid 与mid比较,而不是mid*mid与比较。因为mid*mid可能会溢出。
2.用right = x / 2,可以比right = x省时间。因为根号x小于等于x/2。
3.x / mid == mid并不等同于 mid * mid == x;因为x / mid可能是截断小数位得到的整数。

京公网安备 11010502036488号