JAVA高精度减法模板

1.思路

大数减法的思路和大数相加差不多,模拟手动写减法。先判断A是否大于B,如果A小于B,则要交换A和B,用大一点的数减去小一点的数,最后输出时补负号,我们手写减法时会从个位开始相减,如果不足就要借位,一直到最高位。

2.代码模板
方法一:
//倒序存储,a和b都是第一个为个位,最后一个为最高位,返回值c也一样。如123,实际上a是321存储的
public static List<Integer> subtract(List<Integer> a, List<Integer> b) {
    if(!compare(a,b)) return subtract(b, a);	//如果a比b小则交换a,b位置,结果记得要加‘-’号
    List<Integer> c = new ArrayList<>();	//保存a-b的结果
    for(int i = 0, t = 0; i < a.size(); i++) {	//t为借位
        t = a.get(i) - t;	//先用要计算的位减去借位		
        if(i < b.size()) 	//如果b还有数要计算
            t -= b.get(i);
        c.add((t + 10) % 10);	//两种情况统一处理,不需要借位直接就是c.add(t)和需要借位c.add(t + 10)的情况
        if(t < 0) 		//t小于0则代表要借位,所以t = 1
            t = 1;
        else 
            t = 0;
    }
    //去掉前导0
    while(c.size() > 1 && c.get(c.size() - 1) == 0) 
        c.remove(c.size() - 1);
    return c;
}
//判断两个数那个大,如果a>=b返回true,否则返回false
public static boolean compare(List<Integer> a, List<Integer> b){
    if(a.size() != b.size())
        return a.size() > b.size();
    for(int i = a.size() - 1; i >= 0; i--)
        if(a.get(i) != b.get(i))
            return a.get(i) > b.get(i);
    return true;
}

方法二:
//Java大数
BigInteger a = new BigInteger(s[0]);
BigInteger b = new BigInteger(s[1]);
BigInteger c = a.subtract(b);
3.复杂度分析
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
4.注意

要注意两个数哪个大,一般用较大的数减去较小的数,结果记得补’-'号;借位要处理好;最后就是要注意前导0的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值