Que08|792. 高精度减法

75 阅读1分钟
题目:792. 高精度减法 - AcWing题库
思路/想法:

image.png

什么时间加负号?怎么模拟计算过程?怎么选定长数组?怎么借位?怎么循环借位?怎么删除前导0?

一个减法如此多娇...

代码实现:
// 逆天
import java.io.*;
import java.math.BigInteger;

public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BigInteger a = new BigInteger(reader.readLine());
        BigInteger b = new BigInteger(reader.readLine());
        System.out.println(a.subtract(b));
        reader.close();
    }
}


import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s1 = sc.next();
        String s2 = sc.next();
        
        int[] arr1 = new int[s1.length()];
        int[] arr2 = new int[s2.length()];
        
        int j = 0;
        for (int i = s1.length() - 1; i >= 0; i--) arr1[j++] = s1.charAt(i) - '0';
        j = 0;
        for (int i = s2.length() - 1; i >= 0; i--) arr2[j++] = s2.charAt(i) - '0';
        
        if (!cmp(arr1, arr2)) { // arr1 小于 arr2 时加负号
            System.out.print("-");
        }
        List<Integer> ans = sub(arr1, arr2); // 减法过程
        for (int i = ans.size() - 1; i >= 0; i--) { // 输出结果
            System.out.print(ans.get(i));
        }
    }
    public static List<Integer> sub(int[] arr1, int[] arr2) { // 减法模拟过程
        if (!cmp(arr1, arr2)) { // 调换数组,保证大值减小值
            return sub(arr2, arr1);
        }
        List<Integer> ans = new ArrayList<>();
        int t = 0;
        for (int i = 0; i < arr1.length; i++) {
            t = arr1[i] - t; // 大值对应位数的值减去上一位的进位值t
            if (i < arr2.length) t -= arr2[i]; // 减去小值对应位数的值
            ans.add((t + 10) % 10); // 如果大值对应位数的值小于小值对应位数的值,则借位+10 
            if (t < 0) t = 1; // t < 0 说明借位了,下一位再计算时应该减去1
            else t = 0; // 否则没有进位就默认置为0
        }
        // 删除前导0
        while (ans.size() > 1 && ans.get(ans.size() - 1) == 0) ans.remove(ans.size() - 1);
        return ans;
    }
     public static boolean cmp(int[] arr1, int[] arr2) {
        if (arr1.length > arr2.length) {
            return true;
        } else if (arr1.length < arr2.length) {
            return false;
        } else {
            for (int i = arr1.length - 1; i >= 0; i--) {
                if (arr1[i] != arr2[i]) {
                    return arr1[i] > arr2[i];
                }
            }
            return true;
        }
    }
}