求一个数的平方根

来源:互联网 发布:上瘾网络剧全集下载 编辑:程序博客网 时间:2024/05/17 18:01

方法一: 使用标准库函数, <math.h>中的sqrt函数直接计算。

其函数原型为: float sqrt (float),double sqrt (double),double long sqrt(double long)

但是不知道标准库函数时怎么实现的。


方法二:二分查找法

可以根据自己希望的精确度来规定循环的结束条件。

[cpp] view plaincopy
  1. double sqrtby2(double a)  
  2. {  
  3.     if(a <= 0)  
  4.         return 0;  
  5.     double mid, pre;  
  6.     double low=0, high=a;  
  7.     mid = (low + high)/2;  
  8.     do{  
  9.         if(mid*mid > a)  
  10.             high = mid;  
  11.         else  
  12.             low = mid;  
  13.         pre = mid;  
  14.         mid = (low + high)/2;  
  15.     }while(abs(mid-pre) > 0.0000001);  
  16.     return mid;  
  17. }  


方法三:牛顿迭代法

要计算a的平方根,首先随便猜一个估计值c,然后不断令c等于c和a/c的平均数

[cpp] view plaincopy
  1. double sqrtbynewton(double a)  
  2. {  
  3.     double c = a;//这里用a本身作为估计值  
  4.     double pre;  
  5.     do  
  6.     {  
  7.         pre = c;  
  8.         c = (x + a/c)/2;  
  9.     }while(abs(c-pre) > 0.0000001);  
  10.     return x;  
  11. }  

牛顿迭代法的依据:

设曲线f(x) = x^2 - a,那么该曲线与x轴的交点的x的值即为所求的a的平方根。现在,借助曲线的切线来逐步接近那个交点。该曲线在某个值x'处的切线为y=2x'(x-x')+x'^2-a。那么在曲线在估计值c时的切线为y=2c(x-c)+c^2-a,该切线与x轴的交点为(c+a/c)/2,作图即可看出,这个点距离所求点更接近了。



附加:Leetcode上也有此题,只不过要求返回值是int。如果在迭代时就用int,可能会死循环而求不出结果。所以还是先用浮点数求,然后再取整。

class Solution {public:    int sqrt(int x) {        if(x <= 0)            return 0;        double c = x;        double old;        do        {            old = c;            c = (c + x/c)/2;        }while(abs(old - c) > 0.0000001);                return int(c);    }};


原创粉丝点击