Sqrt(x)
Implement int sqrt(int x)
.
Compute and return the square root of x.
传说中的牛顿法,请查看百度百科
某人说我偷懒,那我就决定还是翻些资料出来比较好。。。
牛顿法主要用于两方面,一是求方程根,二是最优化处理。
求方程根的原理是利用泰勒公式在x0处展开,且展开到一阶,即f(x) = f(x0)+(x - x0)f'(x0)
求解方程f(x)=0,即f(x0)+(x-x0)*f'(x0)=0,求解x = x1=x0 - f(x0)/f'(x0),因为这是利用泰勒公式的一阶展开,f(x) = f(x0)+(x - x0)f'(x0)处并不是完全相等,而是近似相等,这里求得的x1并不能让f(x)=0,只能说f(x1)的值比f(x0)更接近f(x)=0。
因此,不断对方程式进行迭代,可以进而推出x(n+1)=x(n)-f(x(n))/f'(x(n)),最后,这个式子必然在f(x*)=0的时候收敛。整个过程如下图:
该题要求某数的正平方根,因此可以构造函数 f(x) = x2 - a,f(x) = 0 选取x1 = 1 利用泰勒公式进行展开,可以得出一系列x2,x3,x4....,当x(n-1)和x(n)之间差值近乎为0,这是可以认为已经收敛,x(n)是方程f(x) = x2 - a的解。
1 class Solution { 2 public: 3 int sqrt(int a) { 4 if( a <= 0 ) return 0; 5 double x1 = 0; 6 double x2 = 1; 7 while( abs( x1-x2 ) > 1e-7 ) { 8 x1 = x2; 9 x2 = x1/2 + 1.0*a / (2*x1); 10 } 11 return x1; 12 } 13 };