求一个数的平方根

来源:互联网 发布:视频倒放软件 编辑:程序博客网 时间:2024/05/16 00:47
求一个数的平方根的整数部分,二分搜索方法,若求浮点数,使用牛顿迭代法。

计算x2 = n的解,令f(x)=x2-n,相当于求解f(x)=0的解,如左图所示。

   首先取x0,如果x0不是解,做一个经过(x0,f(x0))这个点的切线,与x轴的交点为x1

   同样的道理,如果x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x2

   以此类推。

   以这样的方式得到的xi会无限趋近于f(x)=0的解。

   判断xi是否是f(x)=0的解有两种方法:

   一是直接计算f(xi)的值判断是否为0,二是判断前后两个解xi和xi-1是否无限接近。

 

经过(xi, f(xi))这个点的切线方程为f(x) = f(xi) + f’(xi)(x - xi),其中f'(x)为f(x)的导数,本题中为2x。令切线方程等于0,即可求出xi+1=xi - f(xi) / f'(xi)。

继续化简,xi+1=xi - (xi- n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n/xi) / 2。

#include <iostream>using namespace std;int sqrt(int x) {    if(x<0)        return -1;    else if(x == 0||x == 1)        return x;    else    {        unsigned int mid;        mid = x/2;        unsigned int div;        while(mid >= 0)        {            div = x/mid;            if(div == mid)                return mid;            else if(div > mid)            {                while(mid*mid<x)                {                    mid++;                }                if(mid*mid==x)                    return mid;                return mid-1;            }            while(mid > div+1)            {                mid = mid>>1;                div = div<<1;            }            mid--;        }    }}int main(){    while(1)    {        int m;        cin>>m;        cout<<sqrt(m)<<endl;    }    return 0;}

0 0
原创粉丝点击