#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
//判断A是不是大于B
bool cmp(vector<int> &A, vector<int> &B) {
/*首先比较位数,如果A和B的位数不相等,如果A的位数
* 大于B的位数,返回1,如果A的位数小于B的位数,返回0*/
if(A.size() != B.size()) return A.size() > B.size();
/*如果位数相等,执行下面的循环*/
/*因为读入的时候,A是倒着读进来的,比如说a是123,b是231,那么A容器
* 里面就是321 B容器里面就是132,我们比较数字大小,一般是先比较大位
* 所以应该先比较容器的最后一位,也就是上面举例的百位数字*/
for (int i = A.size() - 1; i >= 0; i--) {
if (A[i] != B[i]) return A[i] > B[i];
//如果A的最后一位大于B,也就是A得最大位大于B,那么A > B
//循环直到判断出到底谁是最大的为止
}
return true;
/*如果上面的判断语句和最后的循环语句都判断为1,
* 那么说明这两个容器里存储的数字是大小相同的,返回真*/
}
/*下面这个高精度减法函数已经假定A返过来的数 > B,所以说下面的main函数会通过判断语句去把两个实参的位置调换,
为的就是保证A反过来的数大于B
* */
vector<int> sub(vector<int> &A, vector<int> &B) {
vector<int> c; //定义一个名为c的容器
int t = 0;
for(int i = 0; i < A.size(); i++){
t = A[i] - t; //当i=0时候,相当于把a的个位赋值给t
if(i < B.size()) t -= B[i];;//相当于a的个位减去b的个位
c.push_back((t + 10) % 10 ); //把t放入c容器的最后一个位置
/*当t的值是负数的时候,会向前面借位,这个位加10,
* 当t的值为正数时,这个取的仍然是t,比如13%10 = 3*/
/*当t < 0 的时候,会向前借位,这个时候要用上一位的数字减去1,
* 见上面的 t = A[i] - t*/
if (t < 0) t = 1;
else t = 0; //当t为正数时,因为要进行下一次的位对位运算,所以把t归零
}
//因为减完之后,前面会有前导0,比如231- 133 = 098,
//因此,去掉前导0是有必要的
/*只要c的长度大于1,就可能会有前导0的情况出现
* c.back()是c容器中的最后一个数字,也就是a-b后的第一个数字,
* 如果这个数字是0,也就是说,存在前导0
* c.pop_back() 是相当于删除最后c的最后一位,也就是a-b得最后一个数字
* 这样我们就能成功删除掉前导0了*/
while(c.size() > 1 && c.back() == 0) c.pop_back(); //去掉前导0
return c;
}
int main(void) {
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');
if (cmp(A, B)) {
vector<int> C = sub(A, B);
for (int i = C.size() - 1; i >= 0; i--) {
printf("%d", C[i]);
}
} else {
vector<int> C = sub(B, A);
printf("-");
for (int i = C.size() - 1; i >= 0; i--) {
printf("%d",C[i]);
}
}
}