您的位置:首页 > 其它

两个大数相加问题

2018-04-02 19:53 309 查看
问题:

输入:

行数n,接下来n行每行两个数

输出:

n行,每行为两个数的和

Notice that the integers are very large, that means you should not process them by using 32-bit integer.

先贴出我的解决代码(经过运行为正确)

import java.math.BigInteger;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
BigInteger[][] a=new BigInteger
[2];
BigInteger[] b=new BigInteger
;
for (int i = 0; i < b.length; i++) {
b[i]=new BigInteger(String.valueOf(0));
}
for (int i = 0; i <n; i++) {
for (int j = 0; j < a[i].length; j++) {
a[i][j]=in.nextBigInteger();
}
}
for (int i = 0; i < n; i++) {
for(int j=0;j<a[i].length;j++){
b[i]=b[i].add(a[i][j]);
}
}
for (int i = 0; i < b.length; i++) {
System.out.println(a[i][0]+"+"+a[i][1]+"="+b[i]);
}
}


}

BigInteger常用来处理大数问题。

遇到问题:

1:给b[i]赋a[i][0]加自身的值时:b[i].add(a[i][j]);

出现未能给b[i]成功赋值的情况。

原因:因为BigInteger与BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以b[i].add(a[i][j]);虽然做了加法操作,但是b[i]并没有保存加操作后的值,正确的用法应该是b[i]=b[i].add(a[i][j]);减乘除操作也是一样的返回一个新的BigDecimal对象,b[i]这个BigDecimal对象也应该声明。(当然这儿在数组处就已经声明了)

2:报空指针异常:在b[i]=b[i].add(a[i][j]);这一行代码处

可能有以下几种情况发生空指针异常:(网上查询结果)

解释是”程序遇上了空指针”。简单地说就是调用了未经初

始化的对象或者是不存在的对象,这个错误经常出现在创建图

片,调用数组这些操作中,比如图片未经初始化,或者图片创建

时的路径错误等等。对数组操作中出现空指针。数组的初始化是

对数组分配需要的空间,而初始化后的数组,其中的元素并没有

实例化,依然是空的,所以还需要对每个元素都进行初始化(如

果要调用的话)

我认为是在这儿我没有初始化b数组,造成了报空指针异常。

所以我用了一个循环对数组进行初始化。

我将b[]中的数全部初始化为0,调用了BigInteger的构造方法,先将int转换为十进制的字符串形式,再转换为BigInteger。

(在实际项目中不建议将int转换为BIgInteger,会损失精度)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: