leetcode 69. Sqrt(x) 牛頓法求平方根
阿新 • • 發佈:2019-01-29
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;