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

为何生成杨辉三角第33行的Java代码返回负值?

杨辉三角第33行代码返回负值的原因及修复

问题原因

整数溢出是核心问题。Java的int类型取值范围是 -2147483648 到 2147483647,你的代码在计算组合数时,先执行乘法操作 mCk *= (rowIndex-i),这个中间结果会超过int的最大值,触发溢出回绕(数值超过上限后从最小值开始计数),导致数值变为负数,后续除法操作无法修正这个错误,最终得到异常的负值甚至0。

比如计算第33行第12个元素时,中间乘法步骤的结果会突破int上限,溢出后变成负数,再除以对应数值就得到了错误的-3096621。

修复方案

将中间计算变量的类型从int改为long,long的取值范围远大于int(-9223372036854775808到9223372036854775807),足够容纳第33行所有组合数的中间计算结果。最终结果转换回int即可,因为第33行的所有组合数都在int的取值范围内。

修改后的代码:

class Solution {
    public List<Integer> getRow(int rowIndex) {
        
        List<Integer> result = new ArrayList<Integer>();
        for(int k=0; k<=rowIndex; k++){
            long mCk = 1; // 改用long存储中间结果
            for(int i=0; i<k; i++){
                mCk *= (rowIndex-i);
                mCk /= (i+1);
            }
            result.add((int)mCk); // 结果在int范围内,安全转换
        }
        return result;
    }
}

补充说明

杨辉三角第n行的元素是组合数C(n,k),当n=33时,最大的组合数是C(33,16)=1166803110,这个值本身在int范围内,但计算过程中的中间乘积会超过int上限,所以必须用更大的数值类型承载中间计算过程,避免溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:18:18