任务描述
定义一个数的逆如下:两个数互为逆,当且仅当它们的绝对值位数相同且各位对应数字之和为 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));
}
}
}
}