题目描述
给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围:
1 ≤ n . l e n g t h ≤ 100000 1 \le n.length \le 100000 1≤n.length≤100000
输入样例:
32
11
输出样例:
21
Solution
package cn.zxy.test;
import com.sun.org.apache.bcel.internal.generic.FSUB;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
/**
* 高精度减法
* 32
* 11
*
* 21
*/
public class highPrecisionSubtraction{
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String a = in.readLine(), b = in.readLine();
List<Integer> x = new ArrayList<>();
List<Integer> y = new ArrayList<>();
for (int i = a.length() - 1; i >= 0; i--) {
x.add(a.charAt(i) - '0');
}
for (int i = b.length() - 1; i >= 0; i--) {
y.add(b.charAt(i) - '0');
}
Deque<Integer> c = new ArrayDeque<>();
//如果 x 大于等于 y , 就用x - y
//如果 x 小于 y,就先打印负号,再计算y - x
if (cmp(x, y)) c = sub(x, y);
else {
System.out.print("-");
c = sub(y, x);
}
while (!c.isEmpty()){
System.out.print(c.pop());
}
}
private static Deque<Integer> sub(List<Integer> x, List<Integer> y) {
Deque<Integer> d =new ArrayDeque<>();
// t 记录借位
int t = 0;
for(int i = 0; i < x.size(); i++){
t = x.get(i) - t;
if(i < y.size()) t = t - y.get(i);
d.push((t + 10) % 10);
// 如果 t 为负数,就借一位,否则不用借位
t = t < 0 ? 1 : 0;
}
// 去除前导 0
while( d.size() > 1 && d.peek() == 0) d.pop();
return d;
}
private static boolean cmp(List<Integer> x, List<Integer> y) {
if (x.size() != y.size()) return x.size() > y.size();
for (int i = x.size() - 1; i >= 0; i--) {
if (x.get(i) != y.get(i)) return x.get(i) > y.get(i);
}
return true;
}
}