我正在实现Partition function,你可以在第一个函数中看到long(或int)的返回值没问题。
public static long p(int n) {
long[] ways = new long[n + 1];
ways[0] = 1;
int[] coins = new int[n];
for(int i = 0; i < n; i++)
coins[i] = i + 1;
for(int coin : coins) {
for(int j = coin; j <= n; j++) {
ways[j] += ways[j - coin];
}
}
return ways[n];
}
它返回正确的值。但是当我使用BigInteger值实现它时(当输入n非常大,返回值超出Long的范围时),结果是错误的,java.lang.NullPointerException.
我找不到我做的地方incorrectedly。带有错误 的 功能如下:
public static BigInteger p(int n) {
BigInteger[] ways = new BigInteger[n + 1];
//initial the BigInteger[] ways------> Additional question: Is it necessary?
ways[0] = BigInteger.ONE;
for(int i = 1; i < n; i++)
ways[i] = BigInteger.ONE; // --update-- Here should be initialed with BigInteger.ZERO, not ONE!
int[] coins = new int[n];
for(int i = 0; i < n; i++)
coins[i] = i + 1;
for(int coin : coins) {
for(int j = coin; j <= n; j++) {
BigInteger temp = ways[j].add(ways[j - coin]);
ways[j] = temp;
}
}
return ways[n];
}
任何回复将不胜感激!
答案 0 :(得分:2)
你的way-array的大小为n + 1。在你的for循环中,你从i = 1&lt; ñ。不应该是&lt;的n + 1?
而不是
for(int i = 1; i < n; i++)
ways[i] = BigInteger.ONE;
你应该做
for(int i = 1; i < n+1; i++)
ways[i] = BigInteger.ONE;
答案 1 :(得分:1)
你必须在for循环中将n更改为n + 1:
for(int i = 1; i < n; i++)
ways[i] = BigInteger.ONE;