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

计算n!/k!时long类型溢出问题求助:如何得到合法long范围结果

问题分析

你的代码核心问题是先计算完整阶乘再做除法:long类型的最大值是9223372036854775807,20!刚好卡在这个范围内,但21!就会溢出变成负数,后续除法自然得到错误结果。哪怕n=20、k=19时20!没溢出,这种计算方式也完全没必要——n!/k!本质就是从k+1到n的连乘,直接计算这个乘积能避免中间值暴增,从根源解决溢出问题。

解决方案

跳过完整阶乘的计算,直接求n × (n-1) × ... × (k+1):

  • 先处理边界:n < k时返回0(整数除法下n!/k!为0);n == k时返回1;
  • 初始化结果为1,从k+1循环到n逐步相乘,中间值始终是最终结果的一部分,不会出现远超long范围的无效值。
修正后的代码
public static long penguPermutation(long n, long k) {
    // 处理边界情况
    if (n < k) {
        return 0;
    }
    if (n == k) {
        return 1;
    }
    long result = 1;
    // 直接计算k+1到n的乘积,等价于n!/k!
    for (long i = k + 1; i <= n; i++) {
        result *= i;
    }
    return result;
}
验证示例
  • n=20、k=19时,计算结果为20,符合预期;
  • n=10、k=5时,计算6×7×8×9×10=30240,和10!/5!的结果完全一致,且全程无溢出。

内容的提问来源于stack exchange,提问作者Amvanyy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:05:20