/* 分三種情況: 1.減數長度大於被減數 交換減數與被減數,輸出負號,方便減 2.減數長度等於被減數(分三種情況) a.減數大於被減數,類似1情況1 b.減數等於被減數,兩數相等,直接輸出0,完成。 c.減數小於被減數 3.減數長度小於被減數 */ #include<stdio.h> #include<string.h> int main() { char ch1[1000], ch2[1000]; int num1[1000], num2[1000], num[1000]; int i, j, flag1 = 1, max, flag2 = 0; scanf("%s", ch1); scanf("%s", ch2); max = strlen(ch1); if (strlen(ch1)<strlen(ch2)) {//減數長度大於被減數,必定為負數 flag1 = -1; max = strlen(ch2); printf("-"); } if (strlen(ch1) == strlen(ch2)) flag1 = 0;//確定輸入數字的長度比較結果。便於采用合理的運算方式 for (i = 0; i<max; i++) {//初始化 num[i] = 0; num1[i] = 0; num2[i] = 0; } for (i = strlen(ch1) - 1, j = 0; i >= 0; i--) num1[j++] = ch1[i] - '0';//將字符數組元素所對應數字存入整形數組 for (i = strlen(ch2) - 1, j = 0; i >= 0; i--) num2[j++] = ch2[i] - '0'; //分情況對數字進行減法運算 if (flag1 == 1) {//第三種情況 for (i = 0; i<strlen(ch1); i++) { num[i] = num1[i] - num2[i]; if (num[i]<0) { num[i] += 10; num1[i + 1]--; } } } else if (flag1 == 0) {//第二種情況 for (i = strlen(ch1) - 1; i <= 0; i--) {//循環結束的情況有兩種 1.ch1[i]!=ch2[i] 2.遍歷完數組中所有元素 if (ch1[i] != ch2[i]) break; } if (ch1[i]>ch2[i]) {//ch1[i]>ch2[i],自然相減 for (i = 0; i<strlen(ch1); i++) { num[i] = num1[i] - num2[i]; if (num[i]<0) { num[i] += 10; num1[i + 1]--; } } } else if (ch1[i] == ch2[i]) {//相等為0 printf("0"); } else {//輸出負號,交換減數被減數 printf("-"); for (i = 0; i<strlen(ch1); i++) { num[i] = num2[i] - num1[i]; if (num[i]<0) { num[i] += 10; num2[i + 1]--; } } } } else {//第一種情況 for (i = 0; i<strlen(ch2); i++) { num[i] = num2[i] - num1[i]; if (num[i]<0) { num[i] += 10; num2[i + 1]--; } } } for (i = max; i >= 0; i--) { if (num[i] <= 0 && flag2 == 0) continue; flag2 = 1; printf("%d", num[i]); } return 0; }