为何生成杨辉三角第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
相关产品推荐
相关产品推荐

