#include
#include
#define N 201
/* 大数的加减,一般用字符数组完成*/
int main(void)
{
char num1[N]; // 被减数
char num2[N]; // 减数
char diff[N]; // 差值
int digit; // 位数
int i, j, k = 0;
int len1, len2;
int borrow = 0; // 借位
scanf("%d%s%s", &digit, num1, num2); // 获取位数,被减数,减数
len1 = strlen(num1);
len2 = strlen(num2);
for (i = len1 - 1, j = len2 - 1; i > -1 && j > -1; i--, j--)
{
char exclude_borrow = num1[i] - borrow; // 先减上一次的借位
if (exclude_borrow < num2[j]) // 不够减,则向高位借 1(其值为 digit 的值)
{
diff[k++] = exclude_borrow + digit - num2[j] + '0';
borrow = 1; // 发生借位,所以需要将借出的值在下一位的运算中减去
}
else // 没有借位
{
diff[k++] = exclude_borrow - num2[j] + '0';
borrow = 0;
}
}
/* 始终需要注意,字符运算,最终需要还原成字符,比如 '1' - '1' = '0', 而不是 0。
所以结果需要加上 '0'
*/
/* 减数的位数已经减完之后,还有借位需要处理,所以运算没有结束 */
for (; i > -1; i--)
{
if (num1[i] < borrow)
{
diff[k++] = num1[i] + digit - borrow;
borrow = 1;
}
else
{
diff[k++] = num1[i] - borrow;
borrow = 0;
}
}
/* 最终结果 diff 是差值的逆序,所以需要做一次反转 */
for (i = k - 1; i > -1; i--)
{
if (diff[i] != '0') // 忽略前面的零,从第一个非零数开始
break;
}
for (; i > -1; i--)
printf("%c", diff[i]);
printf("\n");
return 0;
}