方法一:二分法
class Solution {
public:
int mySqrt(int x) {
//注:在中间过程计算平方的时候可能出现溢出,所以用long long。
long long i=0;
long long j=x/2+1;//对于一个非负数n,它的平方根不会大于(n/2+1)
while(i<=j)
{
long long mid=(i+j)/2;
long long res=mid*mid;
if(res==x) return mid;
else if(res<x) i=mid+1;
else j=mid-1;
}
return j;
}
};
作者:chenlele
链接:https://leetcode-cn.com/problems/sqrtx/solution/x-de-ping-fang-gen-by-gpe3dbjds1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:
int mySqrt(int x) {
int left = 1, right = (x >> 1) + 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (mid > x / mid) {
right = mid - 1;
} else if (mid < x / mid) {
left = mid + 1;
} else {
return mid;
}
}
return right;
}
};
作者:Dine
链接:https://leetcode-cn.com/problems/sqrtx/solution/er-fen-cha-zhao-cyu-yan-by-dine/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法二:牛顿法
class Solution {
public:
int mySqrt(int x) {
if (x == 0) return 0;
double last=0;
double res=1;
while(res!=last)
{
last=res;
res=(res+x/res)/2;
}
return int(res);
}
};