You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:40:25