任务描述
定义一个数的逆如下:两个数互为逆,当且仅当它们的绝对值位数相同且各位对应数字之和为 9。例如:11 和 −88 互为逆,999 和 000 互为逆,但 999 和 0 不互为逆。
现在给出多组数对,请编程判断每对数是否互为逆。如果是,请输出它们的和;如果不是,请输出“illegal operation”。
相关知识
参考之前的关卡。
编程要求
根据提示,在右侧编辑器的Begin-End区域内补充代码。
测试说明
输入:第一行为数据组数 T,T∈[1,100];接下来 T 行,每行 2 个数 a 和 b (∣a∣,∣b∣∈[0,10100]),以一个空格分隔。a,b 可能有前导 0 ,仅负数带符号。
输出:对于每组数据,如果 a 和 b 互为逆,输出它们的和 (无前导 0,仅负数有符号);否则输出“illegal operation”。
例如测试集 1 的输入是: 5 01 98 -100 899 233 332 00000000000001 -99999999999998 -45454 54545
测试集 1 的运行结果为: 99 799 illegal operation -99999999999997 9091
#include <stdio.h> #include <string.h> char result[1000]; char *sub(char *a, char *b) { int c=0,n; while(*(a+c)!='\0') c++; c--; n=c; for(;c>=0;c--) { if(*(a+c)-*(b+c)>=0) { result[c]=*(a+c)-*(b+c)+'0'; } else if(*(a+c)-*(b+c)<0) { *(a+c-1)=*(a+c-1)-'1'+'0'; result[c]=*(a+c)-*(b+c)+'9'-'0'+'1'; } } while(result[0]=='0') { for(c=0;c<=n;c++) result[c]=result[c+1]; result[n]='\0'; n--; } return(result); } int main() { char sa[1000], sb[1000]; char *a, *b; int signa, signb; int i, t, la, lb; scanf("%d", &t); while (t--) { scanf("%s%s", sa, sb); a = (sa[0] == '-') ? sa + 1 : sa; b = (sb[0] == '-') ? sb + 1 : sb; signa = (sa[0] == '-') ? 1 : 0; signb = (sb[0] == '-') ? 1 : 0; la = strlen(a); lb = strlen(b); if (la != lb) printf("illegal operation\n"); else { int flag = 1; for (i = 0; i < la; i++) { if (a[i] + b[i] - '0' - '0' != 9) { printf("illegal operation\n"); flag = 0; break; } } if (flag == 0) { continue; } if (signa == 1 && signb == 1) { printf("-"); for (i = 0; i < la; i++) printf("9"); printf("\n"); } else if (signa == 0 && signb == 0) { for (i = 0; i < la; i++) printf("9"); printf("\n"); } else if (signa == 0 && signb == 1) { if (strcmp(a, b) >= 0) printf("%s\n", sub(a, b)); else printf("-%s\n", sub(b, a)); } else { if (strcmp(b, a) >= 0) printf("%s\n", sub(b, a)); else printf("-%s\n", sub(a, b)); } } } }