java - Java 中的分区函数 NullPointerException

标签 java algorithm nullpointerexception

我正在实现 Partition function ,可以看到第一个函数中long(or 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。我找不到我做错的地方。 有 bug 的函数如下:

    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];
        }

任何回复将不胜感激!

最佳答案

您的 ways-array 的大小为 n+1。在你的 for 循环中,你从 i = 1 < n 开始。不应该是

代替

for(int i = 1; i < n; i++)
        ways[i] = BigInteger.ONE;

你应该做的

for(int i = 1; i < n+1; i++)
        ways[i] = BigInteger.ONE;

关于java - Java 中的分区函数 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17946460/

相关文章:

algorithm - 变体调度算法

android - google plus登录中的空指针异常

android - 从 Activity 访问 Fragment 的 View

java - 在 HashMap 中包含 HashMap - 通过引用或重复键调用?

java - 将两个字符串输入数组后停止重复提示?

java - 将 Java Web 服务与 Unix 安全集成

javascript - 将间隔集拆分为最小的不相交间隔集

Java:比较 3 个正整数时出现问题

java - 为什么转义序列在java中不能表示为unicodeEscape?

java - Gson 和 SharedPreferences 导致 NullPointerException