求一个数的平方根

142 篇文章 20 订阅
44 篇文章 1 订阅

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

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

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


方法二:二分查找法

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

[cpp]  view plain copy
  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 plain copy
  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);
    }
};


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值