欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

华为机试HJ107:求解立方根

程序员文章站 2024-03-22 23:31:46
...

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

计算一个数字的立方根,不使用库函数。

保留一位小数。

输入描述:

待求解参数,为double类型(一个实数)

输出描述:

输入参数的立方根。保留一位小数。

示例:

输入:

216

输出:

6.0

解题思路:

这是道数学题,求解数值的立方根,就是求解fx=x^3-C的零根,C就是数值,x就是我们要解的立方根。有两种方法,一种方法就是暴力遍历,将x从某个初始值开始,每0.05进行一次立方计算,判断与C的差值是否大于0,若某个数值所得差值从负数变为正数,该数值近似为解;另一种方法就是牛顿迭代法,计算xn+1=xn+(C/xn^2-xn)/3,若某个xn+1的立方同C差值的绝对值小于某个精度,则认为找到该值,至于为什么用这个式子,可以百度牛顿迭代法,百度百科讲的很清楚。

测试代码:

#include <iostream>
#include <math.h>
#include <iomanip>

using namespace std;

double func(double t,double num)
{
    if(abs(t*t*t-num)<0.00001)
        return t;
    else
        return func((num/t/t+2*t)/3,num);
}

int main()
{
    double num;
    while(cin>>num)
    {
        cout<<fixed<<setprecision(1)<<func(1.,num)<<endl;
    }
    return 0;
}