1.思路
大数减法的思路和大数相加差不多,模拟手动写减法。先判断A是否大于B,如果A小于B,则要交换A和B,用大一点的数减去小一点的数,最后输出时补负号,我们手写减法时会从个位开始相减,如果不足就要借位,一直到最高位。
2.代码模板
方法一:
import java.util.*;
class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String a = in.next();
String b = in.next();
List<Integer> a1 = new ArrayList<>();
List<Integer> b1 = new ArrayList<>();
for (int i = a.length() - 1; i >= 0; i -- )
a1.add(a.charAt(i) - '0');
for (int i = b.length() - 1; i >= 0; i -- )
b1.add(b.charAt(i) - '0');
if(!compare(a1, b1))
System.out.print('-');
List<Integer> c = subtract(a1, b1);
for(int i = c.size() - 1; i >= 0; i--)
System.out.print(c.get(i));
System.out.println();
in.close();
}
//倒序存储,a和b都是第一个为个位,最后一个为最高位,返回值c也一样。如123,实际上a是321存储的
public static List<Integer> subtract(List<Integer> a, List<Integer> b) {
if(!compare(a,b)) return subtract(b, a); //如果a比b小则交换a,b位置,结果记得要加‘-’号
List<Integer> c = new ArrayList<>(); //保存a-b的结果
for(int i = 0, t = 0; i < a.size(); i++) { //t为借位
t = a.get(i) - t; //先用要计算的位减去借位
if(i < b.size()) //如果b还有数要计算
t -= b.get(i);
c.add((t + 10) % 10); //两种情况统一处理,不需要借位直接就是c.add(t)和需要借位c.add(t + 10)的情况
if(t < 0) //t小于0则代表要借位,所以t = 1
t = 1;
else
t = 0;
}
//去掉前导0
while(c.size() > 1 && c.get(c.size() - 1) == 0)
c.remove(c.size() - 1);
return c;
}
//判断两个数那个大,如果a>=b返回true,否则返回false
public static boolean compare(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;
}
}
方法二:
//Java大数
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
String[] s = cin.readLine().split(" ");
BigInteger n = new BigInteger(s[0]);
s = cin.readLine().split(" ");
BigInteger m = new BigInteger(s[0]);
System.out.println(n.subtract(m));
}
}
3.复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)
4.注意
要注意两个数哪个大,一般用较大的数减去较小的数,结果记得补’-‘号;借位要处理好;最后就是要注意前导0的情况