#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <vector>
const int N = 1e5 + 10;
using namespace std;
typedef vector<int> VT;
string a, b;
bool check(VT A, VT B)
{
// A和B位数不同,且A的位数大于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];
//此时说明A和B位数相同,且每一位的数字也相同
return true;
}
// A >= B
VT sub(VT A, VT B)
{
int t = 0;
VT C;
for (int i = 0; i < A.size(); i ++)
{
// t = A[i] - B[i] - t; //t为1说明需要A的上一位需要借位
t = A[i] - t;
if (i < B.size()) t = t - B[i];
// 如果t为负数则需要向上借位,保证t一定大于零
C.push_back((t + 10) % 10);
if (t < 0) t = 1;
else t = 0;
}
// 如果C只有一位,表示结果A- B= 0,此时需要保留0
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main()
{
cin >> a >> b;
VT 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');
VT C;
// 用大的减小的
if (check(A, B)) C = sub(A, B);
else C = sub(B, A), printf("-");
for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
return 0;
}
评论