高精度减法

72 阅读1分钟

模板

  • C++
// C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(vector<int> &A, vector<int> &B)
{
    vector<int> C;
    for (int i = 0, t = 0; i < A.size(); i ++ )
    {
        t = A[i] - t;
        if (i < B.size()) t -= B[i];
        C.push_back((t + 10) % 10);
        if (t < 0) t = 1;
        else t = 0;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}
  • Java
public static List<Integer> sub(List<Integer> num1, List<Integer> num2) {
    List<Integer> num3 = new ArrayList<>();
    int t = 0;
    for (int i = 0; i < num1.size(); i++) {
        t = num1.get(i) - t;
        if (i < num2.size()) {
            t -= num2.get(i);
        }
        num3.add((t + 10) % 10);
        if (t < 0) {
            t = 1;
        } else {
            t = 0;
        }
    }
    while (num3.size() > 1 && num3.get(num3.size() - 1) == 0) {
        num3.remove(num3.size() - 1);
    }
    return num3;
}

练习

02 高精度减法

  • 题目

Snipaste_2023-02-22_20-24-21.png

  • 题解
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] chars1 = br.readLine().toCharArray();
        List<Integer> num1 = new ArrayList<>();
        for (int i = chars1.length - 1; i >= 0; i--) {
            num1.add(chars1[i] - '0');
        }
        char[] chars2 = br.readLine().toCharArray();
        List<Integer> num2 = new ArrayList<>();
        for (int i = chars2.length - 1; i >= 0; i--) {
            num2.add(chars2[i] - '0');
        }
        br.close();

        if (!cmp(num1, num2)) {
            System.out.print("-");
        }
        List<Integer> num3 = sub(num1, num2);
        for (int i = num3.size() - 1; i >= 0; i--) {
            System.out.print(num3.get(i));
        }
    }

    public static boolean cmp(List<Integer> num1, List<Integer> num2) {
        if (num1.size() != num2.size()) {
            return num1.size() > num2.size();
        }
        for (int i = num1.size() - 1; i >= 0; i--) {
            if (num1.get(i) != num2.get(i)) {
                return num1.get(i) > num2.get(i);
            }
        }
        return true;
    }

    public static List<Integer> sub(List<Integer> num1, List<Integer> num2) {
        if (!cmp(num1, num2)) {
            return sub(num2, num1);
        }

        List<Integer> num3 = new ArrayList<>();
        int t = 0;
        for (int i = 0; i < num1.size(); i++) {
            t = num1.get(i) - t;
            if (i < num2.size()) {
                t -= num2.get(i);
            }
            num3.add((t + 10) % 10);
            if (t < 0) {
                t = 1;
            } else {
                t = 0;
            }
        }
        while (num3.size() > 1 && num3.get(num3.size() - 1) == 0) {
            num3.remove(num3.size() - 1);
        }
        return num3;
    }
}
import java.io.*;
import java.math.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BigInteger num1 = new BigInteger(br.readLine());
        BigInteger num2 = new BigInteger(br.readLine());
        br.close();
        System.out.println(num1.subtract(num2));
    }
}