LC69.Sqrtx
题目
给你一个非负整数x,不使用内建函数或运算符,求x的整数平方根
题解
//方法1
//该问题可转化为 求 n^2 <= x,求n的最大值
//使用二分查找
class Solution_1
{
public:
int mySqrt(int x)
{
if (x < 2) return x;
int l = 0, r = x / 2, mid = 0;
while (l <= r)
{
mid = (l + r) / 2;
if ((long long)mid * mid <= x)
{
l = mid + 1;
}
else r = mid - 1;
}
return l - 1;
}
};
//方法2
//使用指数函数和对数函数替代平方根函数
//sqrt(x)可以变换为 e^(0.5lnx)
#include <cmath>
class Solution_2
{
public:
int mySqrt(int x)
{
if (x == 0) return 0;
int ans = exp(0.5 * log(x));
return ((long long)(ans + 1) * (ans + 1) <= x ? ans + 1 : ans);//计算机无法存储准确的浮点数,需要判断正确答案
}
};
//方法3
//牛顿迭代
class Solution_3
{
public:
int mySqrt(int x)
{
if (x == 0) return 0;
double C = x, x0 = x;
while (true)
{
double xi = 0.5 * (x0 + C / x0);
if (fabs(x0 = xi) < 1e-7) break;
x0 = xi;
}
return int(x0);
}
};