这题是给出一个x,求平方根。
一种直接二分,一种牛顿迭代求不动点。
二分:
class Solution {
public:
bool isAns(long long r, long long x)
{
if (r*r<=x && (r + 1)*(r + 1)>x)
return true;
return false;
}
int mySqrt(int x) {
if (x <= 0)
return 0;
long tar = x;
long long low = 0,high= x;
long long mid = low + (high - low) / 2;
while (!isAns(mid, tar))
{
if ((mid + 1)*(mid + 1) <= tar)
{
low = mid+1;
}
else{
high = mid-1;
}
mid = low + (high - low) / 2;
}
return mid;
}
};
牛顿法:
#include <math.h>
class Solution{
public:
int mySqrt(int x) {
if (x <= 0)
return 0;
double init = x / 2.0;
double ans = init* 0.5 + x / (2 * init);
while (fabs(ans - init) > 0.005)
{
init = ans;
ans = init* 0.5 + x / (2 * init);
}
return (int)ans;
}
};