Java中的分区函数NullPointerException

时间:2013-07-30 12:00:24

标签: java algorithm nullpointerexception

我正在实现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];
        }

任何回复将不胜感激!

2 个答案:

答案 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;