1. 程式人生 > >leetcode 69. Sqrt(x) 牛頓法求平方根

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軸的交點,看下面的動態圖:

【用牛頓迭代法開平方】

令:

 
所以f(x)的一次導是:

牛頓迭代式:

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

例如計算,即a=2。




……


計算器上可給出

【用牛頓迭代法開任意次方】

的遞推式是:

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