指针-数的互逆

简介: 指针-数的互逆

任务描述

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



相关文章
|
2月前
|
C语言
【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)1
【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)
186 51
|
2月前
|
编译器
【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)2
【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)
|
2月前
|
编译器
【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)3
【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)
|
2月前
1004.最大连续1的个数
1004.最大连续1的个数
18 0
|
2月前
数组地址等于第一个元素地址
数组地址等于第一个元素地址
|
11月前
不使用第三变量。如何对2个数进行交换
不使用第三变量。如何对2个数进行交换
62 0
|
9月前
|
C语言
C语言之将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
C语言之将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
210 0
|
12月前
|
Cloud Native Go
927. 三等分:计数和三指针
这是 力扣上的 927. 三等分,难度为 困难。
有一个整形数组, a[3] = {7,2,5}, 要求使用指针实现数组成员由小到大的顺序排列,即结果为:a[3] = {2,5,7};(C++指针练习2)
有一个整形数组, a[3] = {7,2,5}, 要求使用指针实现数组成员由小到大的顺序排列,即结果为:a[3] = {2,5,7};(C++指针练习2)
指针的运算系列(2):指针-指针(相减)
指针的运算系列(2):指针-指针(相减)
118 0
指针的运算系列(2):指针-指针(相减)