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

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轴的交点,看下面的动态图:
leetcode 69. Sqrt(x) 牛顿法求平方根_第1张图片

【用牛顿迭代法开平方】

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

牛顿迭代式:

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

例如计算,即a=2。




……


计算器上可给出

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

求的递推式是:


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



你可能感兴趣的:(C++,LeetCode)