华为OJ题目(十五):求解立方根

华为OJ题目(十五):求解立方根_第1张图片

//求解立方根

/*思路:
用牛顿迭代法,即可解决。

设 r 是的根,选取 x0 作为 r 的初始近似值:
过点(x0, f(x0))做曲线y = f(x)的切线L,L的方程为 y = f(x0) + f′(x0)(x−x0),求出L与x轴交点的横坐标 x1 = x0−f(x0)/f′(x0),称 x1为 r 的一次近似值。
过点(x1, f(x1)) 做曲线 y = f(x) 的切线,并求该切线与x轴交点的横坐标 x2 = x1−f(x1)/f′(x1),称 x2 为 r 的二次近似值。
重复以上过程,得 r 的近似值序列。其中, xn + 1 = xn−f(xn)/f′(xn) 称为 r 的 n + 1 次近似值,上式称为牛顿迭代公式。

首先确定我们的函数 f(x):
f(x) = x3−m
其中 m 是一个常数,程序的输入。求导函数:
f′(x) = 3x2
*/

#include 
#include 
using namespace std;

double getCubeRoot(double m)
{
	double x0, xn = 1;
	const double err = 0.01;
	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;
}

int main()
{
	double  m,result;
	cin >> m;
	result = getCubeRoot(m);
	//cout << result << endl;//默认输出是6精度的
	cout << fixed << setprecision(1) << result << endl;// 加了fixed意味着是以固定点方式显示,所以这里的精度指的是小数位,输出为6.0
	
	return 0;
}


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