为什么我的Biginteger.multiply()会显示NullPointerException?

时间:2015-09-19 05:37:15

标签: java biginteger

我尝试将阶乘从1到1000初始化为一个大整数数组并计算数字的总和。为什么这段代码显示java.lang.NullPointerException?我认为一切都已正确初始化。

class Main {

public static void main(String[] args) {

    BigInteger[] b = new BigInteger[1010];
    int[] ara = new int[1010];
    BigInteger c;

    b[0] = BigInteger.ONE;
    b[1] = BigInteger.ONE;

    ara[0] = ara[1] = 1;
    String s;
    int l, sum;

    for (int i = 2; i <= 1001; i++) {
        c = b[i - 1];
        b[i] = b[i].multiply(c);
        s = b[i].toString();
        l = s.length();
        sum = 0;

        for (int j = 0; j < l; j++) {
            sum += Character.getNumericValue(s.charAt(j));
        }
        ara[i] = sum;
    }

2 个答案:

答案 0 :(得分:2)

问题:

    b[i] = b[i].multiply(c);

查看您初始化的b数组

 b[0] = BigInteger.ONE;
 b[1] = BigInteger.ONE;

现在看看for循环

 for (int i = 2; i <= 1001; i++) {
        c = b[i - 1];
        b[i] = b[i].multiply(c);

您只有01个索引。它将抛出NPE作为索引2.

您正在尝试在1001个元素上循环,并且您的数组中只有2个元素。首先用{0}填充b数组。

解决方案:

如下所示更改for循环并保持一致。它有效。

for (int i = 2; i <= 1001; i++) {
         b[i] = BigInteger.ONE;
        c = b[i - 1];
        b[i] = b[i].multiply(c);
        s = b[i].toString();

答案 1 :(得分:1)

factorial的算法是取一些值n并将n乘以n - 1,直到达到值1。您的算法似乎没有这样做(它生成一个)。我想你想要像

这样的东西
int len = 1010;
BigInteger[] b = new BigInteger[len];
int[] ara = new int[len];
for (int i = 0; i < len; i++) {
    // calculate factorial.
    b[i] = BigInteger.valueOf(i + 1);
    for (int j = i; j > 1; j--) {
        b[i] = b[i].multiply(BigInteger.valueOf(j));
    }
    // now sum digits.
    for (char ch : b[i].toString().toCharArray()) {
        ara[i] += Character.getNumericValue(ch);
    }
}