华为OJ(求解立方根)

来源:互联网 发布:传奇盛世转生修为数据 编辑:程序博客网 时间:2024/06/05 02:52

描述:

  • 计算一个数字的立方根,不使用库函数。
  • 函数原型double getCubeRoot(double input)

输入:

待求解参数 double类型

输出:

输出参数的立方根,保留一位小数

样例输入:

<code class="hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">216</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

样例输出:

<code class="hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">6.0</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li></li></ul>
常见的用牛顿迭代法,即可解决。

设 r 是的根,选取 x0 作为 r 的初始近似值:

  • 过点(x0,f(x0))做曲线y=f(x)的切线L,L的方程为 y=f(x0)+f(x0)(xx0),求出L与x轴交点的横坐标 x1=x0f(x0)f(x0),称 x1为 r 的一次近似值。

  • 过点 (x1,f(x1)) 做曲线 y=f(x) 的切线,并求该切线与x轴交点的横坐标 x2=x1f(x1)f(x1),称 x2 为 r 的二次近似值。

  • 重复以上过程,得 r 的近似值序列。其中, xn+1=xnf(xn)f(xn) 称为 r 的 n+1 次近似值,上式称为牛顿迭代公式


首先确定我们的函数 f(x)

f(x)=x3m

其中 m 是一个常数,程序的输入。求导函数:

f(x)=3x2



#include<iostream>#include<iomanip>using namespace std;double getCubeRoot(double);const double err=0.01;int main(){double m;cin>>m;double result = getCubeRoot(m);     cout << fixed << showpoint << setprecision(1) << result << endl;//system("pause");return 0;}double getCubeRoot(double m){double x0,xn=1;double y=xn*xn*xn;while(y-m>err||y-m<-err){x0=xn;xn=x0-(x0*x0*x0-m)/(3*x0*x0);y=xn*xn*xn;}return xn;}






0 0