代码之家  ›  专栏  ›  技术社区  ›  Satory

带简单运算符的第n个根

  •  -2
  • Satory  · 技术社区  · 6 年前

    我试图创建一个函数来查找一个数的第n个根,而不使用数学等库。我只能使用+-*/运算符。

    到目前为止,我一直在尝试重现 Math.Pow(double num, double root) 功能,但没有运气,因为我不能想出一个解决方案,需要两倍。

    我试过用这个:

    double pow(double a, int n) {
    double result = 1;
    for(int i = 0; i < n; i++) {
        result *= a
    }
    return result;
    

    但这对我来说并不真正有效,因为它需要一个int作为根,而不是一个double。

    我需要源代码或 Math.Pow(double a, double b)

    1 回复  |  直到 6 年前
        1
  •  -1
  •   dumetrulo    6 年前

    让我们调整一下Rosetta代码中的代码( https://rosettacode.org/wiki/Nth_root ):

    private static double DPow(double a, int n)
    {
        var result = 1.0;
        for (; n > 0; n--) result *= a;
        return result;
    }
    
    private static double DAbs(double a)
    {
        return (a > 0.0) ? a : -a;
    }
    
    public static double NthRoot(double a, int n, double p)
    {
        var _n = (double)n;
        var x0 = a;
        var x1 = a / _n;
        while (DAbs(x0 - x1) > p)
        {
            x1 = x0;
            x0 = (1.0 / _n) * (((_n - 1.0) * x1) + (a / DPow(x1, _n - 1.0)));
        }
        return x0;
    }
    
    public static double NthRoot(double a, int n)
    {
        return NthRoot(a, n, .0001);
    }
    

    我们实现了一个简单的pow函数和一个非常简单的abs函数,并使用这两个函数来实现Rosetta代码站点给出的算法。希望这能满足您的要求!