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

题目链接:传送门

题目描述:

  求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。



……

计算器上可给出

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

的递推式是:

  

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

时间: 2024-07-29 11:41:31

【leetcode】【二分 | 牛顿迭代法】69_Sqrt(x)的相关文章

51nod 1166 大数开平方(高精度+牛顿迭代法)

分析:直接用二分还是会T,用更快的牛顿迭代法.把问题转化为求x^2-n=0的根,假设解为x0,当前解为x且x^2-n>0,在(x,x^2-n)处作切线,与x轴交点横坐标为新的x,然后迭代即可,比二分法快,但是貌似只能用在凹函数或凸函数上.. java水高精度真是666... 1 import java.io.*; 2 import java.util.*; 3 import java.math.BigInteger; 4 public class Main { 5 public static v

牛顿迭代法与一道经典编程问题

牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method).它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法. 既然牛顿迭代法能够用来求解方程的根,那么最好还是以方程 x2=n 为例,来试着求解它的根. 为此. 令f(x)=x2?n, 也就是相当于求解 f(x)=0 的解.如上图所看到的. 首先随便找一个初始值 x0,假设 x0不是解,做一个经过 (x0,f(x0)) 这个点的切线,与x轴的交点为x1.相同的道理.假

牛顿迭代法求解平方根

牛顿迭代法求解平方根 2015-05-16 10:30 2492人阅读 评论(1) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 一个实例 迭代简介 牛顿迭代法 牛顿迭代法简介 简单推导 泰勒公式推导 延伸与应用 一个实例 //java实现的sqrt类和方法 public class sqrt { public static double sqrt(double n) { if (n<0) return Double.NaN; double err = 1e

经典算法:牛顿迭代法求平方根

//牛顿迭代法求平方根 1 double mysqrt(double num) 2 { 3 double x = num/2; 4 double y = 0; 5 do{ 6 x = x/2+num/(2*x); 7 y = x*x-num; 8 if(y<0) y = -y; 9 } while(y>0.0001); 10 return x; 11 } 12 int main(int argc, char* argv[]) 13 { 14 printf("%.3f",my

牛顿迭代法(Newton&#39;s Method)

牛顿迭代法(Newton's Method) 简介 牛顿迭代法(简称牛顿法)由英国著名的数学家牛顿爵士最早提出.但是,这一方法在牛顿生前并未公开发表. 牛顿法的作用是使用迭代的方法来求解函数方程的根.简单地说,牛顿法就是不断求取切线的过程. 对于形如f(x)=0的方程,首先任意估算一个解x0,再把该估计值代入原方程中.由于一般不会正好选择到正确的解,所以有f(x)=a.这时计算函数在x0处的斜率,和这条斜率与x轴的交点x1. f(x)=0中精确解的意义是,当取得解的时候,函数值为零(即f(x)的

C语言实现牛顿迭代法解方程

利用迭代算法解决问题,需要做好以下三个方面的工作: 一.确定迭代变量 在可以用迭代算法解决的问题中,我们可以确定至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量. 二.建立迭代关系式 所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系).迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成. 三.对迭代过程进行控制 在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题.不能让迭代过程无休止地执行下去.迭代过程的控制通常可分为两种情况

sqrt (x) 牛顿迭代法

参考: 0开方 是 0 1的开方式 1 2的开方式 1.4 3.的开方=(1.4+3/1.4)/2 牛顿迭代法:学习自 http://blog.csdn.net/youwuwei2012/article/details/34075241 public class Solution { public int sqrt(int x) { if(x==0)return 0; double pre=0; double cur=1; while(Math.abs(cur-pre)>0.000001) {

Atitit 迭代法&#160;&#160;“二分法”和“牛顿迭代法&#160;attilax总结

Atitit 迭代法  "二分法"和"牛顿迭代法 attilax总结 1.1. ."二分法"和"牛顿迭代法"属于近似迭代法1 1.2. 直接法(或者称为一次解法),即一次性的快速解决问题,1 1.3. 最常见的迭代法是"二分法 牛顿法.还包括以下算法1 1.4.  二分法(dichotomie)1 1.5. 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method

c语言:用牛顿迭代法求方程在1.5附近的根:2x^3-4x^2+3x-6=0.

用牛顿迭代法求方程在1.5附近的根:2x^3-4x^2+3x-6=0. 解:牛顿迭代法又叫牛顿切线法.设f =2x^3-4x^2+3x-6,f1为方程的导数,则f1 = 6x^2 - 8x+3,且f1=(f(x0)-0)/(x0-x1),推导得:x1 = x0 - f / f1 程序: #include<stdio.h> #include<math.h> int main() { double x0,x1,f,f1; x1 = 1.5; do { x0 = x1; f = 2*x0