介绍
高精度减法
:实现两个大整数相减,代码实现过程类似于纸上进行减法运算
实现思路
将两个整数按位存储到列表中,设置一个 t 进行借位标识,同时在运算之前要进行大小比较
举例
【题目描述】
给定两个正整数(不含先导0),计算它们的差,计算结果可能为负数
【输入格式】
共两行,每行包含一个整数
【输出格式】
共一行,表示所求的差
【数据范围】
1 ≤ 整数长度 ≤ 1e5
代码实现
import java.util.*;
public class Main{
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<>();
List<Integer> B = new ArrayList<>();
//按位倒序存储,方便进行减法运算,并且存储时将字符转换为数字
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');
if(cmp(A, B)){
List<Integer> C = sub(A, B);
for(int i = C.size() - 1; i >= 0; i --){System.out.print(C.get(i));}
}else{
List<Integer> C = sub(B, A);
System.out.print("-");//如果为负数,先输出负号
for(int i = C.size() - 1; i >= 0; i --){System.out.print(C.get(i));}
}
}
//按位比较两个大整数的大小
public static boolean cmp(List<Integer> A, List<Integer> B){
//如果位数不同,直接返回位数的比较结果
if(A.size() != B.size()) return A.size() > B.size();
else{
//如果位数相同,从高位开始循环,直到两者不同,返回两者比较的结果
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;
}
public static List<Integer> sub(List<Integer> A, List<Integer> B){
List<Integer> C = new ArrayList<>();
for(int i = 0, t = 0; i < A.size(); i ++){
//应该为 t = A.get(i) - B.get(i)- t,但需要判断B是否存在该位
t = A.get(i) - t;
if(i < B.size()) t -= B.get(i);
//若存在不够减的情况,t为负数,则存储时应借十取余
C.add((t + 10) % 10);
//如果t < 0,说明不够减,则应让表示借位的t为1
if(t < 0) t = 1;
else t = 0;
}
//注意可能存在高位相同,相减后导致存在高位为0的情况
while(C.size() > 1 && C.get(C.size() - 1) == 0) C.remove(C.size() - 1);
return C;
}
}