原题链接 https://leetcode.com/problems/sqrtx/
Implement int sqrt(int x)
.
Compute and return the square root of x.
用数学的方法求解sqrt(x)
可以使用牛顿迭代法,也可以使用二分法。
我使用的是牛顿迭代法,前段时间看到一个求解x^(-2)的快速解就用的是牛顿迭代法。
设 x^2 - n == 0 方程的非负根便是解。f '(x) = 2x,
对于点(x0,f(x0)),对过该点原图像的切线方程为y - f(x0) = 2x0(x - x0),
该切线与x轴的交点更接近正确解。
x比x0更接近准确解。
化简后得到 ,迭代值x与x0的值相差为1e-10是停止迭代。
class Solution {
public:
int mySqrt(int x) {
if (x == 0)return 0;
double cur = x;
double pre;
do{
pre = cur;
cur = (cur + x / cur) / 2;
} while (abs(cur - pre) > 1e-10);
return (int)cur;
}
};