计算序列: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;
}
计算以下总和 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;
}