/* 题目不难,一个大数减法,一个大数的比较,关键是边界条件的检查 */ #include <stdio.h> #include <string.h> #include <stdlib.h> int code[10] = {0,1,2,-1,-1,5,9,-1,8,6}; //这个是0-9旋转之后的数字,-1表示旋转之后出错 /* 大数的减法 */ void minus(char s[1000],char s1[1000]) { int k = 0; for(int i=strlen(s) - 1;i> -1;i--) //注意此时倒着计算,是从 strlen(s) - 1开始,不是从 strlen(s) { if(s[i] < (s1[i] + k)) { //s[i] = 10 + s[i] - s1[i] - k; //做减法后还要转换成字符,也就是加上 '0' s[i] = 10 + s[i] - s1[i] - k + '0'; k = 1; } else { s[i] = s[i] - s1[i] - k + '0'; k = 0; } } bool flag = false; //由于结果的高位也就是数组的前面可能出现 0,而这些 0 是没有必要输出的。 for(int j=0; j<strlen(s);j++) { if(flag) { printf("%c",s[j]); continue; } if(s[j] == '0') continue; // s[j] = '\0'; else { printf("%c",s[j]);//别忘了这个,这个边界要注意 flag = true; } } printf("\n"); } int cmp(char s[1000],char s1[1000]) { if(s[0] > s1[0]) //如果最高位不同 { return 1; } else if((s[0] < s1[0])) { return -1; } else if(s[0] == s1[0]) //最高位相同 { int k = 0; while(s[k] == s1[k] && k < strlen(s)) //这个地方表示相同则一直向后走, k++; /* 这被注释掉两个语句出现的原因是刚开始考虑的是此时的s[k] != s1[k],所以要回退一下, 因此如果两个数字完全相同的话,k 会退后就是 strlen(s) - 1,不是strlen(s) 但是下面的操作直接是从不相等的部分开始的,所以没有必要回退 */ //k --; //if(k == strlen(s1) - 1) if(k == strlen(s)) //可能有两个数字相等的情况。 return 0; else if(s[k] > s1[k]) return 1; else return -1; } } int main() { char str[1000]; char str1[1000]; int time = 0; freopen("in.txt","r",stdin); scanf("%d",&time); for(int i=0;i<time;i++) { memset(str,'\0',sizeof(str)); memset(str1,'\0',sizeof(str1)); scanf("%s",str); int j = 0; int len = strlen(str); while(j< len) { if(code[str[j] - '0'] == -1) break; str1[len - j - 1] = code[str[j] - '0'] + '0'; j ++; } if(j < len) { printf("ERROR\n"); continue; } switch(cmp(str,str1)) { case 0: printf("0\n"); break; case -1: { minus(str1,str); break; } case 1: minus(str,str1); break; } } return 0; } /* int main() //这个方案是错误的是因为没有考虑大数的问题 { int time; int num; freopen("in.txt","r",stdin); scanf("%d",&time); for(int i=0;i<time;i++) { scanf("%d",&num); int tmpNum = num,newNum =0,tmp; int j = 0; while(tmpNum != 0) { if( code[tmpNum % 10] == -1) break; newNum = code[tmpNum % 10] + newNum * 10; j++; tmpNum = tmpNum /10; } if(tmpNum != 0) printf("ERROR\n"); else if(num > newNum) printf("%d\n",num - newNum); else printf("%d\n",newNum - num); } fclose(stdin); return 0; } */
水题一个,对我来说关键的是 边界条件的检查