给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1 ≤ 整数长度 ≤ 10^5
输入样例:
32
11
输出样例:
21
高精度减法算法分析
- 同高精度加法一样,进行减法运算同样需要逆序存储,从前往后比从后往前好算
- 在进行减法运算之前先比较两个数的大小,遵循大数减小数
- 模拟减法规则,从个位到高位进行相减,若个位不够减则向上一个高位借1
sub(A,B)
函数中,C = A - B,
若A >= B
则求A - B
,否则A < B
则求(B - A)
,最后再把'-'
号添上- 若遍历完整个
A
,需要将最靠左的且为0
的高位全部去除掉
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class HighPrecisionSubtraction {
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<Integer>();
List<Integer> B = new ArrayList<Integer>();
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');
List<Integer> C = new ArrayList<Integer>();
if (compareTo(A, B)) {
C = sub(A, B);
} else {
C = sub(B, A);
System.out.print("-");
}
for (int i = C.size() - 1; i >= 0; i -- ) System.out.print(C.get(i));
}
//进行两数比较,遵循大数减小数
private static boolean compareTo(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;
}
private static List<Integer> sub(List<Integer> A, List<Integer> B) {
List<Integer> C = new ArrayList<Integer>();
int t = 0;
for (int i = 0; i < A.size(); i ++ ) {
t = A.get(i) - t;
if (i < B.size()) t -= B.get(i);
C.add((t + 10)% 10);
if (t < 0) t = 1;
else t = 0;
}
//去掉前导0,比如660 - 630, 百位6会减成0,但还是会加入进集合
while (C.size() > 1 && C.get(C.size() - 1) == 0) C.remove(C.size() - 1);
return C;
}
}