不使用BigInteger计算大数字阶乘(C#实现)
无需System.Numerics库的大整数阶乘实现(返回字符串)
当然存在这类算法,核心思路是用数组/列表模拟手动乘法的过程——因为大整数无法被常规数值类型容纳,我们直接操作每一位数字完成计算,最终将数字序列转为字符串返回。
实现步骤
- 用列表存储阶乘结果的每一位数字(低位在前,方便处理进位),初始值设为
[1](对应0!和1!的结果) - 遍历从2到输入整数
n的每个数,依次与当前列表中的每一位数字相乘 - 处理每一步的进位:每一位相乘后,保留个位数字作为当前位,十位及以上的部分作为进位传递到下一位
- 计算完成后,将列表反转(把低位在前转为高位在前),再拼接成字符串
C# 代码示例
public static string CalculateFactorial(int n) { if (n < 0) throw new ArgumentOutOfRangeException(nameof(n), "输入数字不能为负数"); // 用List存储每一位数字,低位在前 List<int> digits = new List<int> { 1 }; for (int i = 2; i <= n; i++) { int carry = 0; for (int j = 0; j < digits.Count; j++) { int product = digits[j] * i + carry; digits[j] = product % 10; // 保留当前位的个位 carry = product / 10; // 进位部分 } // 处理剩余的进位 while (carry > 0) { digits.Add(carry % 10); carry /= 10; } } // 反转列表,转为高位在前的字符串 digits.Reverse(); return string.Concat(digits); }
测试验证
- 输入
n=30,返回结果:265252859812191058636308480000000 - 输入
n=70,返回结果:11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000
这个算法的时间复杂度为O(n * k),其中k是阶乘结果的位数,对于常规的int输入完全适用,即使计算数千的阶乘也能高效运行。
内容的提问来源于stack exchange,提问作者Umicron
相关产品推荐
相关产品推荐

