码迷,mamicode.com
首页 > 其他好文 > 详细

【leetcode】【二分 | 牛顿迭代法】69_Sqrt(x)

时间:2019-07-12 11:22:10      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:www   ble   problems   lan   ocs   交点   height   怎样   event   

题目链接:传送门

 

题目描述:

  求Sqrt(x),返回整数值即可。

【代码】:

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N = 1e6+10 ;
 4 /*
 5 int mySqrt ( int x ){
 6     int L = 1 , R = N , mid , ans = 0 ;
 7     while ( L <= R ){
 8         mid = ( L + R ) >> 1 ;
 9         if( mid <= x / mid ){
10             L = mid + 1 ;
11             ans = mid ;
12         }else {
13             R = mid - 1 ;
14         }
15     }
16     return ans ;
17 }
18 */
19 int mySqrt ( int x ) {
20     if ( !x ) 
21         return 0 ;
22     double eps = 1e-4;
23     double res = x , Last;
24     while ( true ){
25         Last = res ;
26         res = 0.5 * ( res + x/res ) ;
27         if( fabs( Last - res ) < eps){
28             break ;
29         }
30     }
31     return (int)res;
32 }
33 int main()
34 {
35     int n;
36     while ( ~scanf("%d",&n) ) {
37         printf(" Sqrt (%d) = %d \n",n,mySqrt(n) );
38     }
39     return 0;
40 }
mySqrt

【题解】:

  首先有两个做法。

  第一个就是二分法,大家要记住,这个方法需要判溢出,不然会一直错。需要“移乘变除”

  第二种方法就是我想写博客来记录的,我觉得真的非常好的一个想法,就是“牛顿迭代法”。

      主要参考博客和网站:1、求牛顿开方法的算法及其原理,此算法能开任意次方吗?

                2、如何通俗易懂地讲解牛顿迭代法?

                3、知乎“如何通俗易懂地讲解牛顿迭代法求开方?数值分析?”

  以下就是知乎一些比较出色的解答

  “黄徐升”的回答:

  

  有一个利用“将长方形变得更像正方形”的思路也可以得到求 技术图片 的算数平方根的迭代公式

技术图片

  算是通俗易懂地得到了这个迭代公式(不过并没有体现牛顿法的求导等过程,那个用抛物线的切线看是比较直观的,别的回答里已经有了)。

首先是考虑技术图片 是面积为技术图片 的正方形的边长,如果画一个邻边不等的面积是 技术图片 长方形,设这个长方形的长为技术图片 ,宽为技术图片 ,那么怎样能让这个长方形变得更像一个正方形呢?是要把长变得短一点,宽变得长一点,可以用长和宽的平均数技术图片 来作为新的长 技术图片 ,在面积不变的条件下,新的宽是 技术图片 。这样不断操作下去,长方形的长和宽会越来越接近,就是一直趋近与 技术图片 了。

  技术图片

技术图片

 


 

【牛顿迭代法】

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

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

技术图片

【用牛顿迭代法开平方】

令:
技术图片 
所以f(x)的一次导是:
技术图片
牛顿迭代式:
技术图片

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

例如计算技术图片,即a=2。
技术图片
技术图片
技术图片
……


计算器上可给出技术图片

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

技术图片的递推式是:
技术图片

 

 

  

 

【leetcode】【二分 | 牛顿迭代法】69_Sqrt(x)

标签:www   ble   problems   lan   ocs   交点   height   怎样   event   

原文地址:https://www.cnblogs.com/Osea/p/11174846.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!