注意点:
(1)减法的特性:借位。
(2)可能会出现连续借位的情况。
(3)借位前有可能被借位是0。
(4)有可能结果是负数。
(5)注意考虑前面都是0的情况。
代码:
#include<iostream> #include<cstdio> using namespace std; #define maxn 5000001 int a[maxn],b[maxn],cha[maxn+1]; void opera() { memset(a, 0, sizeof(a)); memset(cha, 0, sizeof(cha)); char ch; while(ch = getchar(), ch != ' ') { cha[0] ++; cha[cha[0]] = ch - '0'; } a[0] = cha[0]; for(int i = 1; i <= cha[0]; i++) a[i] = cha[cha[0] + 1 - i]; memset(b, 0, sizeof(b)); memset(cha, 0, sizeof(cha)); while(ch = getchar(), ch != '\n') { cha[0]++; cha[cha[0]] = ch - '0'; } b[0] = cha[0]; for(int i = 1; i <= cha[0]; i++) b[i] = cha[cha[0] + 1 - i]; } void judge() { bool flag = false; if(a[0] < b[0]) flag = true; if(a[0] == b[0]) { for(int i = a[0]; i >= 1; i--) { if(a[i] > b[i]) { flag = false; break; } if(a[i] < b[i]) { flag = true; break; } } } if(flag) { memset(cha, 0, sizeof(cha)); for(int i = 0; i <= a[0]; i++) cha[i] = a[i]; memset(a, 0, sizeof(a)); for(int i = 0; i <= b[0]; i++) a[i] = b[i]; memset(b, 0, sizeof(b)); for(int i = 0; i <= cha[0]; i++) b[i] = cha[i]; } if(flag) printf("-"); } void minu() { memset(cha, 0, sizeof(cha)); cha[0] = a[0]; for(int i = 1; i <= cha[0]; i++) { if(a[i] < b[i]) { a[i] += 10; a[i+1]--; } cha[i] = a[i] - b[i]; } } void printout() { while(cha[0] > 1 && cha[cha[0]] == 0) cha[0] --; for(int i = cha[0]; i >= 1; i--) printf("%d", cha[i]); printf("\n"); } int main(){ int n; scanf("%d", &n); getchar(); for(int i = 1; i <= n; i++) { opera(); judge(); minu(); printout(); } return 0; }