为什么我的 Biginteger.multiply() 显示 NullPointerException?
Why does my Biginteger.multiply() shows NullPointerException?
我尝试将 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;
}
问题:
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);
您只有 0
,1
个索引。它将为索引 2.
抛出 NPE
您正在尝试对 1001 个元素进行循环,但您的数组中只有 2 个元素。首先用零填充 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();
阶乘的算法是取一些值 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);
}
}
我尝试将 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;
}
问题:
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);
您只有 0
,1
个索引。它将为索引 2.
您正在尝试对 1001 个元素进行循环,但您的数组中只有 2 个元素。首先用零填充 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();
阶乘的算法是取一些值 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);
}
}