在C#中将阶乘表示为分母

时间:2019-01-26 01:25:11

标签: c# math factorial

我正在尝试创建一个程序,该程序演示了一种近似欧拉数的方法。我根据的公式是1 + 1/1! + 1/2! + 1/3! + 1/4!...每当我运行该程序时,它就会开始正确地对其进行逼近,但是在经过多次迭代之后,逼近却开始变得无限小。

下面的程序是我尝试将公式转换为代码的尝试。我提示用户输入1 / n的迭代次数!他们想用(valItr)近似e,并且迭代次数由迭代表示。非常感谢您的帮助。

int迭代= 1;

        while (iterations <= valItr)

        {
            Double approxE = 1;
            approxE = approxE + (1 / denomPrev * multiPlier);
            denomPrev = denomPrev * multiPlier;

            iterations++;
            multiPlier++;

            Console.WriteLine(approxE);

        }

4 个答案:

答案 0 :(得分:3)

您的代码比Faruk更好,因为它只需要O(n)乘法,而他需要O(n ^ 2)乘法。但是您在代码中有两个错误。首先,在每个循环中分配approxE = 1。其次

(1 / denomPrev * multiPlier)

评估为

(1 / denomPrev) * multiPlier

那不是您想要的。如果您更正了这些错误,它将起作用。但是您可以将其整理得更多些,例如:

int valItr = 20;
double denomPrev = 1;
double approxE = 1;

for (int iterations = 1; iterations <= valItr; ++iterations)
{
    denomPrev *= iterations;
    approxE += 1 / denomPrev;

    Console.WriteLine(iterations + ": " + approxE);
}

结果完全正确:

1: 2
2: 2,5
3: 2,66666666666667
4: 2,70833333333333
5: 2,71666666666667
6: 2,71805555555556
7: 2,71825396825397
8: 2,71827876984127
9: 2,71828152557319
10: 2,71828180114638
11: 2,71828182619849
12: 2,71828182828617
13: 2,71828182844676
14: 2,71828182845823
15: 2,71828182845899
16: 2,71828182845904
17: 2,71828182845905
18: 2,71828182845905
19: 2,71828182845905
20: 2,71828182845905

答案 1 :(得分:1)

对于我所看到的,双精度不是非常小的有理数。 如果使用小数,则可以精确,但会引发更多分数的错误。

因此,请留下一些外部帮助。

使用BigRational(BigInteger),您可以按原样使用分数,然后在分数上进行数学运算。

(?![0-9])

NuGet:安装软件包BigRationalLibrary

答案 2 :(得分:0)

用于同一计算的另一种方法可以得出(非常)明显更准确的答案。与horner's rule类似,例如,我们注意到

1+1/1!+1/2!+1/3! = 1 + (1/1)*(1 + (1/2)*(1+1/3))

所以,在C语言中,我们可以写

double e = 1.0 + 1.0/N
    while ( --N >= 2)
    {   e = 1.0 + e/N;
    }
    return 1.0 + e;

答案 3 :(得分:-1)

问题在于,在我尝试计算1 / n之前,我需要从前一个分母计算当前分母!

denomPrev = denomPrev * multiplier;              
approxE = approxE + (1 / denomPrev);

^固定了它。