【算法】高精度减法Java

介绍

高精度减法:实现两个大整数相减,代码实现过程类似于纸上进行减法运算

实现思路

将两个整数按位存储到列表中,设置一个 t 进行借位标识,同时在运算之前要进行大小比较

举例

【题目描述】
给定两个正整数(不含先导0),计算它们的差,计算结果可能为负数
【输入格式】
共两行,每行包含一个整数
输出格式】
共一行,表示所求的差
【数据范围】
1 ≤ 整数长度 ≤ 1e5

代码实现

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        String b = sc.next();
        List<Integer> A = new ArrayList<>();
        List<Integer> B = new ArrayList<>();
        //按位倒序存储,方便进行减法运算,并且存储时将字符转换为数字
        for(int i = a.length() - 1; i >= 0; i --)  A.add(a.charat(i)-'0');
        for(int i = b.length() - 1; i >= 0; i --)  B.add(b.charat(i)-'0');
        if(cmp(A, B)){
            List<Integer> C = sub(A, B);
            for(int i = C.size() - 1; i >= 0; i --){System.out.print(C.get(i));}
        }else{
            List<Integer> C = sub(B, A);
            System.out.print("-");//如果为负数,先输出负号
            for(int i = C.size() - 1; i >= 0; i --){System.out.print(C.get(i));}
        }
    }
    
    //按位比较两个大整数的大小
    public static boolean cmp(List<Integer> A, List<Integer> B){
    	//如果位数不同,直接返回位数的比较结果
        if(A.size() != B.size()) return A.size() > B.size();
        else{
        	//如果位数相同,从高位开始循环,直到两者不同,返回两者比较的结果
            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;
    }
    
    public static List<Integer> sub(List<Integer> A, List<Integer> B){
        List<Integer> C = new ArrayList<>();
        for(int i = 0, t = 0; i < A.size(); i ++){
        	//应该为 t = A.get(i) - B.get(i)- t,但需要判断B是否存在该位
            t = A.get(i) - t;
            if(i < B.size()) t -= B.get(i);
            //若存在不够减的情况,t为负数,则存储时应借十取余
            C.add((t + 10) % 10);
            //如果t < 0,说明不够减,则应让表示借位的t为1
            if(t < 0) t = 1;
            else t = 0;
        }
        //注意可能存在高位相同,相减后导致存在高位为0的情况
        while(C.size() > 1 && C.get(C.size() - 1) == 0) C.remove(C.size() - 1);
        return C;
    }
}

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...