Java将long数组转为BigInteger支持大数输出及返回0异常修复方法
问题排查与修复方案
核心问题点
- BigInteger操作逻辑错误
BigInteger为不可变类,所有算术运算方法都不会修改原对象,只会返回运算后的新对象。你原有代码中的
ways.add(xxx)没有接收返回值,ways变量始终保持初始的BigInteger.ZERO,是输出为0的核心原因。
- 边界判断参数颠倒
原long版本的边界规则为
a > A返回0、b >= B返回1,调整后的代码错误将判断条件改为a > B返回0、b >= A返回1,逻辑完全颠倒。
- 数组维度与参数范围不匹配
原long版本dp数组维度为
[A+1][B+5][C],对应参数a的最大取值为A、b的最大取值为B+4;调整后的代码将dp和supportDP数组的维度写反,会导致逻辑异常甚至数组越界。
- 缺少BigInteger导包
代码未引入
java.math.BigInteger包,编译阶段就会报错。
修复后完整代码
import java.math.BigInteger; class WaysDP_Large { static int A = 3; static int B = 2; static int C = 2; static boolean[][][] supportDP = new boolean[A+1][B+5][C]; static BigInteger CountWays(int a, int b, int c, BigInteger [][][]dp) { if (a > A || c >= C) return BigInteger.ZERO; if (b >= B) return BigInteger.ONE; if (supportDP[a][b][c]) return dp[a][b][c]; BigInteger ways = BigInteger.ZERO; // 接收add方法返回的新对象赋值给ways ways = ways.add(CountWays(a+1, b, c+1, dp)); ways = ways.add(CountWays(a+1, b+1, c, dp)); ways = ways.add(CountWays(a+1, b+2, c, dp)); ways = ways.add(CountWays(a+1, b+4, c, dp)); supportDP[a][b][c] = true; return dp[a][b][c] = ways; } public static void main(String[] args) { BigInteger[][][] dp = new BigInteger[A+1][B+5][C]; // 初始化标记数组 for(int i = 0; i < A+1; i++) for(int j = 0; j < B+5; j++) for(int k = 0; k < C; k++) supportDP[i][j][k] = false; System.out.println(CountWays(0, 0, 0, dp)); } }
验证结果
修改后:
- 当参数A=3、B=2、C=2时,输出为13,符合预期
- 当参数A=3、B=4、C=3时,输出为20,符合预期
内容的提问来源于stack exchange,提问作者User_67128
相关产品推荐
相关产品推荐

