#include <iostream>
#include <string>
#include <cstring>
using namespace std;
/*
比较两个字符串的大小,并确保第一个字符串大于等于第二个字符串
入参:两个字符串的引用
如果第二个字符串比第一个字符串小,两个字符串进行对换
*/
void cmpAndSwap(string &str1, string &str2);
/*
将str字符串逐字符逆序存入到nums数组中,nums长度必须大于等于str长度
str : 需要被转换的字符串
nums : 存储数字的数组
len : nums数组的长度,填充0的时候需要用
*/
void strToIntArr(string str, int nums[], int len);
/*
按顺序打印数组元素
flag为true时正序打印
flag为false时倒序打印
*/
template <typename T>
void show(T arr[], int len, bool flag=true);
int main()
{
string str1, str2;
cin >> str1 >> str2;
// 比较并交换,确保第一个字符串比第二个字符串大
cmpAndSwap(str1, str2);
// 确定数字数组的长度,通过cmpAndSwap已经确保str1长度比str2长,直接使用str1长度即可
int len = str1.length();
// 创建存储被减数、减数和差的数组
int num1[len], num2[len], num3[len];
// 将str1和str2字符串分别逐字符逆序存入str1和str2
strToIntArr(str1, num1, len);
strToIntArr(str2, num2, len);
// 减法
for(int i=0;i<len;i++)
{
/*
判断对应位置的被减数是否比减数小
如果小,则被减数+1位置的值-1,然后当前位置值+10
执行减法,结果存入num3对应位置
*/
if(num2[i] > num1[i]){
num1[i+1]--;
num1[i] += 10;
}
num3[i] = num1[i] - num2[i];
}
// 如果num3数组中最后一位为0,len-1
if(num3[len-1] == 0) len--;
show(num3, len, false);
return 0;
}
void cmpAndSwap(string &str1, string &str2)
{
/*
需要对换的情况:
1、第二个字符串长度比第一个字符串长
2、长度相同,但第二个字符串比第一个字符串大
*/
if(str1.length()<str2.length() || (str1.length()==str2.length() && str1<str2))
{
string temp = str1;
str1 = str2;
str2 = temp;
}
}
void strToIntArr(string str, int nums[], int len)
{
// 数组数据填充为0
// memset第三个参数为需要填充的字符数,计算应为每个int类型的所占字符数 * int数组的长度
memset(nums, 0, sizeof(int)*len);
// 确定str字符串长度,用于for循环
int len1 = str.length();
// 数据填充
for(int i=0;i<str.length();i++) nums[i] = str[len1-i-1] - 48;
}
template <typename T>
void show(T arr[], int len, bool flag)
{
if(flag) // 正序打印
for(int i=0;i<len;i++)
cout << arr[i];
else // 逆序打印
for(int i=len-1;i>=0;i--)
cout << arr[i];
cout << endl;
}