计算序列:n!/ (1+1/2+1/3+...+1/n)

Calculate the sequence : n!/ (1+1/2+1/3+...+1/n)

计算以下总和 1!/1 + 2!/(1+1/2) + 3!/(1+1/2+1/3) + ... + n!/ (1+1/2+1/3+. ..+1/n), 其中 n > 0.

public static double GetSumSix(int n)
    {
        double i, result = 0.0;

        static double factorial(double n)
        {
            double res = 1;
            for (double i = 2; i <= n; i++)
                res *= i;

            return res;
        }

        for (i = 1.0; i <= n; i++)
        {
            result += factorial(i) / (1.0 / i);
        }

        return result;
    }

请帮助我,我不明白为什么我的解决方案不起作用?

你的分母逻辑不正确。您可以创建另一个函数来计算“1/1+1/2+...+1/n”是什么并将其用于分母?现在您的代码将计算出 1+2!*2+3!*3+...

您实际上可以使用类似于您的阶乘方法的方法

    static double GetDenominator(double n)
    {
        double res = 1;
        for (double i = 2; i <= n; i++)
            //insert code here 

        return res;
    }

根据你的问题,你的逻辑不正确,而且你的代码不会执行,因为你的 GetSumSix 函数中有一个函数。我在下面的代码中添加了一些帮助点,以便您了解逻辑是如何工作的。

using System;
public class Program
{
  public static void Main()
  {
    var Calculate = GetSumSix(3);
    Console.WriteLine("The Answer is " + Calculate);
  }

  public static double GetSumSix(int n)
  {
    int i; 
    double result = 0.0;
    int factorial = 1;
    string calculatedFormula = String.Empty;
    string FinalFormat = String.Empty;
  
    //Find n!
    for(int x=n;x>=1;x--)
    {
      factorial *=  x; 
    }
    
    // Find Denominator (1+1/2+1/3+…+1/n)
    for (i = 1.0; i <= n; i++)
    {
        result += GetDenominator(i, ref calculatedFormula);
        FinalFormat += calculatedFormula;
    }

    result = factorial/result;
    Console.WriteLine("Calculated Formula is:"+ factorial +"/(" + FinalFormat +")When N is :" + n);
    return result;
  }

  public static double GetDenominator(double n, ref string cal)
  {
    if (n == 1)
    {
        cal += n + "+ ";
        return 1;
    }
    else
    {
        cal = "1/" + n + "+ ";
        return 1 / n;
    }
  }
}

谢谢。

The Lemon的答案是正确的,你没有累加序列的分母所以你计算的是:

 f(n) = 1!/1 + 2!/(1/2) + 3!/(1/3) + ... n!/(1/n)

由于每一项的分子和分母都通过算法链接到前一项的值,因此您可以在每次循环时简单地更新它们。这(稍微)更快并且相当容易阅读。

public static double GetSumSix(int n)
{
    double factorial = 1;
    double denominator = 1;
    double accum = 1;

    for (int i = 2; i <= n; i++)
    {
        factorial *= i;
        denominator += 1.0d/i;
        accum += factorial / denominator;
    }
    
    return accum;
}