二分法与牛顿法

本文介绍了如何利用二分法和牛顿法来求解平方根,结合极限思想,详细阐述了算法实现过程。在幂运算部分,分别展示了线性算法和logN算法的代码实现,针对特定的编程问题,如leetcode 50题,给出了代码解决方案,并解释了round()函数的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分法与牛顿法


这里写图片描述


极限思想

这里写图片描述

这里写图片描述

这里写图片描述

算法实现:

double getE(double n){
    double a = 1;   //a为每一项的值
    double e = a;
    if (n==1) {
        return e;
    }
    for (double i=1; i<=n; i++) {
        a /= i;  //后一项等于前一项处以i
        e += a;  //e等于各项值相加
    }
    return e;
}

这里写图片描述

这里写图片描述

这里写图片描述

double getPI(double n){
    double a = sqrt(3)/3;  //a纪录分子
    double PI = a;
    if (n==1) {
        return PI;
    }
    for (double i=1; i<=n; i++) {
        a = -a/3;     //分子按照该方式迭代
        PI += a/(2*i+1);
    }
    return 6*PI;
}

如何求√3呢?以下引出二分法和牛顿法

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述


幂运算

这里写图片描述

这里写图片描述

线性算法代码

    double powLinear(double x, int n) {
        double result = 1;
        for (int i = 1; i <= n; i++) {
            result *= x;
        }
        return result;
    }
    double myPowLinear(double x, int n) {
        if (n == 0) {
            return 1;
        } else if (n == 1) {
            return x;
        } else {
            if (n > 0) {
                return powLinear(x, n);
            } else {
                return 1 / powLinear(x, -n);
            }
        }
    }

logN算法代码

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

double plus_Pow(double x, int n) {
    double ans = 1;

    if (n==0) {
        return ans;
    }

    double temp = plus_Pow(x, n/2);  //这样计算的话就可以只计算一次;
    if (n%2==0) {
        ans = temp*temp;   //如果这里temp写成plus_Pow(x, n/2);则该同样的式子将被计算多次
    }
    else
        ans = temp*temp*x;
    return ans;
}

double myPow(double x, int n){
    if (n==0) {
        return 1;
    }
    if (n==1) {
        return x;
    }
    if (n>0) {
        return plus_Pow(x, n);
    }
    else
        return 1/plus_Pow(x, -n);  //当n为负数时,计算相应的正数的幂函数后,取倒数

}

这里写图片描述


平方根

  • 题目描述:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

代码实现:

double round(double r)
{
    return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}

double mySqrt(double x){

    double start = 0;
    double end = x;

    while (true) {
        double mid = (start+end)/2;
        if (fabs(mid-x/mid)<0.00001) {  //c++中,求int型平均值用abs(); 求double型的用 fabs();
            double temp = round(mid);  //注意:c++中没有round函数,所以需要自己实现
            if (temp==x/temp) {   // 避免9的根号为2.9999的情况,也就是把所求的结果变为最近的整数,看看这个整数的平方是否为x;如果是,则返回这个整数
                return  temp;
            }
            else
                return mid;
        }
        else if (mid < (x/mid)) {
            start = mid;
        }
        else{
            end = mid;
        }
    }
}

round() 函数的实现:

这里写图片描述


这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

代码:

double myNewtonSqrt(double y){
    double ans = y;
    if (y==0||y==1) {
        return ans;
    }
    while (true) {
        if (fabs(ans-y/ans)<0.00001) {  //c++中,求int型平均值用abs(); 求double型的用 fabs();
            double temp = round(ans);  //注意:c++中没有round函数,所以需要自己实现
            if (temp==y/temp) {   // 避免9的根号为2.9999的情况,也就是把所求的结果变为最近的整数,看看这个整数的平方是否为x;如果是,则返回这个整数
                return  temp;
            }
            else
                return ans;
        }
        else{
            ans = ans - (ans*ans-y)/(2*ans);  //牛顿法递归求解
        }
    }
}

这里写图片描述

这里写图片描述

这里写图片描述

    int mySqrt(int x){
        if (x==0||x==1) {
            return x;
        }
        double ans = x;
        while (true) {
            if (fabs(ans-x/ans)<1&&(floor(ans)-x/ans)<=0) {  
                    return floor(ans);
            }
            else{
                ans = ans - (ans*ans-x)/(2*ans);  //牛顿法递归求解
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值