leetcode 69. Sqrt(x) 牛顿法求平方根

来源:互联网 发布:淘宝买精密管警察找我 编辑:程序博客网 时间:2024/05/21 09:14

Implement int sqrt(int x).

Compute and return the square root of x.

class Solution {public:   int mySqrt(int x) {for (int i = 0; i <= x; i++){if ((i*i) <= x && (i + 1) * (i + 1) > x)return i;if ((i + 1) * (i + 1) <  i*i)return i;}return 0;}};

上面是我自己的解法,非常粗糙,看了discuss后看到大家都在讨论用牛顿法求pingfagen

其实牛顿开方法是牛顿迭代法在开平方上的应用,牛顿迭代法同时也能快速逼近很多方程的解,自然可以用来开任意平方。

,即求的正根。

更一般地,求,即求的正根。

注意牛顿迭代法只能逼近解,不能计算精确解。不过实际应用中,我们都不要求绝对精确的解,例如计算器得出结果也不需要给出无限位,只需要给出十几位小数就足够了,所以牛顿迭代法被广泛用在各种科学计算中。

【牛顿迭代法】

假设方程 在  附近有一个根,那么用以下迭代式子:
 
依次计算、……,那么序列将无限逼近方程的根。

牛顿迭代法的原理很简单,其实是根据f(x)在x0附近的值和斜率,估计f(x)和x轴的交点,看下面的动态图:

【用牛顿迭代法开平方】

令:
 
所以f(x)的一次导是:

牛顿迭代式:

随便一个迭代的初始值,例如,代入上面的式子迭代。

例如计算,即a=2。




……


计算器上可给出

【用牛顿迭代法开任意次方】

的递推式是:


long r = x;    while (r*r > x)        r = (r + x/r) / 2;    return r;