HJ107 求解立方根 泰勒+二分 两种解法 C/C++

题目链接

主要思路

方法一:泰勒
假设输入为n,即要求n的立方根,我们设n的立方根为x,即 x 3 = n x^3=n x3=n。设函数 f ( x ) = x 3 − n , 令 f ( x ) = 0 f(x) = x^3-n,令f(x) = 0 f(x)=x3nf(x)=0,将 f ( x ) f(x) f(x)泰勒展开:
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + . . . + o ( x − x 0 ) f(x) = f(x_0)+f'(x_0)(x-x_0)+...+o(x-x_0) f(x)=f(x0)+f(x0)(xx0)+...+o(xx0)
代入得: f ( x ) = x 0 3 − n + 3 x 0 2 ( x − x 0 ) = 0 f(x) = x_0^3-n+3x_0^2(x-x0) = 0 f(x)=x03n+3x02(xx0)=0
化简得: x = x 0 − ( x 0 3 − n ) / ( 3 x 0 2 ) x = x_0 - (x_0^3-n)/(3x_0^2) x=x0(x03n)/(3x02)
再化简: x = 2 / 3 ∗ x 0 + n / 3 x 0 2 x = 2/3*x_0+n/3x_0^2 x=2/3x0+n/3x02
初始设定x为一个真正答案附近的值,不要太大,也不要太小,然后按照上述求解x的公式,循环逼近,最后在误差允许的范围内求出结果。


方法二:二分
初始设定一个区间,答案一定在这个区间内,每次取该区间中点的值进行运算比较,根据与实际值的大小关系,调整左右边界值,不停缩短区间,最终找到答案。


#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
#define inf 0x3f3f3f3f
using namespace std;
const double eps = 1e-6;//精度

//方法一 泰勒
/*
假设输入为n,即要求n的立方根,我们设n的立方根为x,
即x^3=n。
设函数f(x) = x^3-n,令f(x) = 0,将f(x)泰勒展开:
f(x) = f(x0)+f'(x0)(x-x0)+...+o(x-x0)
代入得:f(x) = x0^3-n+3x0^2(x-x0) = 0
化简得:x = x0 - (x0^3-n)/(3x0^2)
再化简:x = 2/3*x0+n/(3*x0*x0);
*/
double cube1(double n) {
    double x = 2.5;//初值x随便取,不要太大,不要太小
    while(fabs(x*x*x-n)>eps) {
        //x = x-(pow(x,3)-n)/(3*x*x);
        x = 2.0/3*x+n/(3*x*x);
    }
    return x;
}

//方法二:二分
double cube2(double n) {
    double low = min(-1.0,n);
    double high = max(1.0,n);
    double x = (low+high)/2;
    while(fabs(x*x*x-n)>eps) {
        if(x*x*x<n)low = x;
        else high = x;
        x = (low+high)/2.0;
    }
    return x;
}
int main(){
    double n;
    while(cin>>n) {
        printf("%.1lf\n",cube1(n));//调用法一
        //printf("%.1lf\n",cube2(n));//调用法二
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值