算法如同小学的减法运算,不过减法相对加法而言需要注意的就是运算符,最后结果可能为负 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LEN 200 int an1[MAX_LEN+10]; int an2[MAX_LEN+10]; char szLine1[MAX_LEN+10]; char szLine2[MAX_LEN+10]; void sub(char *first, char *second, int nLen1, int nLen2); int main() { scanf("%s", szLine1); scanf("%s", szLine2); int i, j; //库函数memeset将地址an1开始的sizeof(an1)字节内容置成0 //sizeof(an1)的值就是an1的长度 memset( an1, 0, sizeof(an1)); memset( an2, 0, sizeof(an2)); //下面将szLine1中存储的字符串形式的整数转换到an1中去, //an1[0]对应于个位 int nLen1 = strlen( szLine1); int nLen2 = strlen(szLine2); int firstBig = 0; if(nLen1 == nLen2) { for(int i=0; i<nLen1; i++) { if(szLine1[i] > szLine2[i]) { firstBig = 1; break; }else if(szLine2[i] > szLine1[i]) { firstBig = 2; break; } } } if(firstBig == 1 || nLen1 > nLen2) { sub(szLine1, szLine2, nLen1, nLen2); } else if(firstBig == 2 || nLen2 > nLen1) { printf("-"); sub(szLine2, szLine1, nLen2, nLen1); }else { printf("0"); } system("pause"); return 0; } void sub(char *szLine1, char *szLine2, int nLen1, int nLen2) { int i , j = 0; for( i = nLen1 - 1;i >= 0 ; i --) an1[j++] = szLine1[i] - '0'; j = 0; for( i = nLen2 - 1;i >= 0 ; i--) an2[j++] = szLine2[i] - '0'; for( i = 0;i < MAX_LEN ; i ++ ) { if(an1[i] >= an2[i]) //逐位相减 an1[i] -= an2[i]; else { an1[i+1]--; an1[i] += 10; an1[i] -= an2[i]; } } bool bStartOutput = false; //此变量用于跳过多余的0 for( i = MAX_LEN; i >= 0; i-- ) { if( bStartOutput) printf("%d", an1[i]); //如果多余的0已经都跳过,则输出 else if( an1[i] ) { printf("%d", an1[i]); bStartOutput = true; //碰到第一个非0的值,就说明多余的0已经都跳过 } } if(!bStartOutput) //结果为0特殊处理 printf("0"); }