高精度减法
高精度减法模板
给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21
#include<bits/stdc++.h> //万能头文件
using namespace std;
//适用于两个正数的减法
//判断是否有A >= B
bool cmp(vector<int> &A, vector<int> &B) {
if (A.size() != B.size()) {
return A.size() > B.size();
}
for (int i = A.size() - 1; i >= 0; i--) {
if (A[i] != B[i]) {
return A[i] > B[i];
}
}
return true;
}
vector<int> sub(vector<int> &A, vector<int> &B) {
vector<int> C;
//t表示是否有上位
for (int i = 0, t = 0; i < A.size(); i++) {
t = A[i] - t;
if (i < B.size()) {
t -= B[i];
}
//(t + 10) % 10 原因是假如t这个时候是负数,那么需要上一进行变为整数
C.push_back((t + 10) % 10);
if (t < 0) {
t = 1;
} else {
t = 0;
}
}
//去除前置0
while (C.size() > 1 && C.back() == 0) {
C.pop_back();
}
return C;
}
int main() {
string a, b;
vector<int> A, B;
cin>>a>>b;
for (int i = a.size() - 1; i >= 0; i--) {
A.push_back(a[i] - '0');
}
for (int i = b.size() - 1; i >= 0; i--) {
B.push_back(b[i] - '0');
}
//用来比较A,B的最大值,因为减法使用最大值减去最小值
if (cmp(A, B)) {
auto C = sub(A, B);
for (int i = C.size() - 1; i >= 0; i--) {
printf("%d", C[i]);
}
} else {
auto C = sub(B, A);
//因为A < B 所以传入 B - A 是一个正数,故加上负号
printf("-");
for (int i = C.size() - 1; i >= 0; i--) {
printf("%d", C[i]);
}
}
return 0;
}