思路
按照减法运算法则,右对齐、大数减去小数、对应位处理
主要是对低位进位的处理,减法中低位进位c = 1表示低位向高位借一
C++ 代码
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 100010;
int main()
{
char s1[N], s2[N];
scanf("%s%s", s1, s2);
int len1 = strlen(s1), len2 = strlen(s2), flag = 0;
if (len1 == len2 && memcmp(s1, s2, len1) == 0)
{
// 特殊处理结果为0的情况
putchar('0');
return 0;
}
// 保证是大数减去小数,好处理一点
if (len1 < len2 || (len1 == len2 && memcmp(s1, s2, len1) < 0)) swap(s1, s2), swap(len1, len2), flag = 1;
int c = 0; // 低位是否不够减
for (int i = len1 - 1, j = len2 - 1; i >= 0; i--, j--)
{
if (j >= 0) c += s2[j] - '0';
if (s1[i] - '0' < c) s1[i] = s1[i] + 10 - c, c = 1; // 不够减
else s1[i] -= c, c = 0; // 够减
}
if (flag) putchar('-');
int i = 0;
while (s1[i] == '0') i++;
printf("%s", s1 + i);
return 0;
}