华为OJ(求解立方根)

描述:

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

输入:

待求解参数 double类型

输出:

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

样例输入:

216
  • 1

样例输出:

6.0
  • 1
常见的用牛顿迭代法,即可解决。

设 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
#include
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;
}






你可能感兴趣的:(华为OJ初级)