JAVA高精度加法模板--三种解法

1.思路

大数加法主要是模拟手写的加法,我们手写加法时会从个位加上进位一位一位的运算一直加到最高位,就能计算出结果。

2.代码模板
//a,b为要相加的大数,返回a+b的结果
//注意这里的a,b以及要返回的c都是倒序存储的,也就是说第一位是个位,最后一位才是最高位,这就相当于模拟我们手动写加法
public static List<Integer> add(List<Integer> a, List<Integer> b) {
    List<Integer> c = new ArrayList<>();	//保存a+b的结果
    int t = 0, i = 0, j = 0;	//t代表进位,i代表当前a已经计算了多少位,	j代表当前b已经计算了多少位
    while(i < a.size() || j < b.size() || t != 0) {	//如果a或b没计算完,并且还有进位没计算完
        if(i < a.size())			
            t += a.get(i++);
        if(j < b.size())
            t += b.get(j++);
        c.add(t % 10);		//保留t的个位,当作前一位计算出的结果
        t /= 10;			//保留进位
    }
    return c;				//返回答案,记住这里c是倒叙存储的
}

//来一个正序存储版,最后一位为个位,第一位为最高位
public static List<Integer> add(List<Integer> a, List<Integer> b) {
    List<Integer> c = new ArrayList<>();	//保存a+b的结果
    int t = 0, i = a.size() - 1, j = b.size() - 1;//从个位(最后一位)开始计算
    while(i >= 0 || j >= 0 || t != 0) {
        if(i >= 0)
            t += a.get(i--);
        if(j >= 0)
            t += b.get(j--);
        c.add(t % 10);
        t /= 10;
    }
    Collections.reverse(c);		//因为c是倒序存储,所以用集合工具类反转
    return c;					//返回正序存储的答案
}

//再来一个Java语言的大数
BigInteger a = new BigInteger(s[0]);	//大数要用字符串数组保存
BigInteger b = new BigInteger(s[1]);
BigInteger c = a.add(b);
3.复杂度分析
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
4.注意

在面试中尽量不要用语言的特性(比如Java大数)来回答面试官问题,面试官是想考你的思维,而不是考你这些语言的特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值