指针-数的互逆

任务描述

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卑微的Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值