如何在C#中不使用System.Math.E,将阶乘代码整合进e的计算公式?
计算自然常数e的C#实现
首先先修正你现有阶乘代码里的几个问题:
- 变量
A未初始化,会导致编译报错 - 输出字符串的变量顺序颠倒,应该是
Fractorial of {num}! = {A} - 注释里的5!计算逻辑错误,5!是
5*4*3*2*1,不需要乘0
接下来,直接重复计算每个数的阶乘再整合到e的公式里效率很低,用递推方式计算每一项会更高效:因为1/n! = 1/(n*(n-1)!),也就是每一项等于前一项除以n,这样可以避免重复计算阶乘,性能提升明显,尤其是迭代次数较多时。
推荐实现代码(递推式)
using System; class Program { static void Main() { // 迭代次数越多,结果越接近真实的e,建议设为20以上 int iterations = 20; double e = 1.0; // e的初始值对应公式里的第一项1 double currentTerm = 1.0; // 初始项为1/0! = 1 for (int n = 1; n <= iterations; n++) { currentTerm /= n; // 递推计算当前项:1/n! = 前一项 / n e += currentTerm; } Console.WriteLine($"计算得到的e值:{e}"); } }
代码说明
iterations控制迭代次数,设为20时,结果已经非常接近真实的e(约2.718281828459045)- 递推方式避免了重复计算阶乘,每次仅需一次除法操作,效率远高于单独计算每个阶乘再取倒数
- 使用
double类型保证计算精度,避免整数溢出问题
如果你坚持用独立阶乘函数实现
using System; class Program { static void Main() { int iterations = 20; double e = 1.0; for (int n = 1; n <= iterations; n++) { e += 1.0 / CalculateFactorial(n); } Console.WriteLine($"计算得到的e值:{e}"); } // 修正后的阶乘计算方法 static long CalculateFactorial(int num) { if (num == 0 || num == 1) return 1; long factorial = 1; for (int i = 2; i <= num; i++) { factorial *= i; } return factorial; } }
注意事项
- 此方法中
long类型在num超过20时会溢出,因此迭代次数有限;而递推式方法用double可支持更多次迭代,精度也足够满足e的计算需求
内容的提问来源于stack exchange,提问作者H. Cahill
相关产品推荐
相关产品推荐

