一、题目描述
力扣链接:力扣69.x的平方根
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5)
或者 x ** 0.5
。
二、思路分析
可以使用二分查找法来逼近一个数的平方根
cpp
class Solution {
public:
int mySqrt(int x) {
int left = 0, right = x, result = 0;
while (left <= right) {
int mid = (left + right) >> 1;
if ((long long)mid * mid <= x) {
result = mid;
left = mid + 1;
}
else {
right = mid - 1;
}
}
return result;
}
};
牛顿迭代法是一种用于寻找方程根的数值方法,它可以用来求解平方根。对于求解方程 f(x) = 0,牛顿迭代法的迭代公式为:
x n + 1 = x n − f ( x n ) f ' ( x n ) x_{n+1}=x_{n}-\frac{f(x_n)}{f^`(x_n)} xn+1=xn−f'(xn)f(xn)
对于求解 x = 0 \sqrt{x}=0 x =0,则可以令 f ( x ) = x 2 − a f(x)=x^2-a f(x)=x2−a其中 a 是要求平方根的非负整数。
那么迭代公式就变为:
x n + 1 = 0.5 ∗ ( x n + f ( x n ) f ' ( x n ) ) x_{n+1}=0.5*(x_{n}+\frac{f(x_n)}{f^`(x_n)}) xn+1=0.5∗(xn+f'(xn)f(xn))
那么可以写出C++代码
cpp
class Solution {
public:
int mySqrt(int x) {
if (x == 0 || x == 1) {
return x;
}
double result = x;
double epsilon = 1e-6;
while (fabs(result * result - x) > epsilon) {
result = 0.5 * (result + x / result);
}
return static_cast<int>(result);
}
};