实现 int sqrt(int x)
函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4 输出: 2
示例 2:
输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
解法一:
class Solution {
public:
int mySqrt(int x) { //二分法
int low = 0;
int up = x;
while(low <= up){
long mid = (low + up) / 2;
long s = mid * mid;
if(x == s) return mid;
else if(x > s) low = mid + 1;
else up = mid -1;
}
return up;
}
};
注意mid和s的类型不能用int,用int的话可能会越界,会提示超出时间限制的错误。两个int相乘或者相加的结果不要再用int表示,可以考虑用long或long long。
解法二:
class Solution {
public:
int mySqrt(int x) { //牛顿迭代法
if(x == 0) return 0;
double a = 0; // b和a是相邻两次迭代结果
double b = 1; // 在1附近开始找,迭代逼近目标值
while(abs(b-a) > 0.1) // 判断条件为abs(b-a) > 0.1
{
a = b;
b = (b + x/b)/2.0;
}
return int(b); // 返回值要求为int,需强制转换
}
};
利用牛顿迭代法,当两次迭代结果相差不大于0.1时即返回。