Implementint sqrt(int x).
Compute and return the square root of x.
class Solution {
public:
int sqrt(int x) {
if (x == 0)
return 0;
double lastY = 0;
double y = 1;
while (y != lastY)
{
lastY = y;
y = (y + x / y) / 2;
}
return (int)(y);
}
};
求a^(1/2), 即求x^2-a=0的方程的根。
对于这个题目来说,显然求的不是精确解,而是近似解。因此我们可以通过牛顿法来解决这个问题,当然也可以用二分法搜索,这里我就不说明。现在我们来梳理一下如何用牛顿法来获得这个方程的近似解。
简单来说,牛顿迭代法的本质 就是利用函数的切线与x轴的焦点,来不停的逼近方程的解,即当f(x)=0的x的值。
这里f(x)=x^2-a, 可知f(x)'=2x,也就是其导函数。
取随机点x_0 , 则该点表示为(x_0 , (x_0)^2 -a),其斜率为2x_0
则切线与x轴的交点为(2x_0/(-(x_0)^2-a), 0),
然后我们在此点 垂直于x轴,做垂线,并且求出 其与f(x)的交点x_1, 重复迭代 直至收敛
迭代方程:
x_(n+1) = x_n + f(x_n)/f'(x_n)