A-B问题

A+B问题早已经被大家所熟知了,是不是很无聊呢?现在大家来做一下A-B吧。

现在有两个实数A和B,聪明的你,能不能判断出A-B的值是否等于0呢?

输入
有多组测试数据。每组数据包括两行,分别代表A和B。
它们的位数小于100,且每个数字前中可能包含+,- 号。
每个数字前面和后面都可能有多余的0。
每组测试数据后有一空行。
输出
对于每组数据,输出一行。
如果A-B=0,输出YES,否则输出NO。

和上次的A+B四类似,先记录每个数字的符号,然后把符号去掉,处理每个数字的前缀0和后缀0,然后比较。

需要注意的是:

1、删前缀0的时候,整数必须保留一位。

2、只有小数才删后缀0。

3、注意+0 == -0。

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <ctype.h>  
  3. #include <string.h>  
  4. #include <stdlib.h>  
  5. const int M=100000;  
  6. void back(char* c,int &l)  
  7. {  
  8.     if(strchr(c,'.') == NULL)           //整数不用处理后缀  
  9.         return ;  
  10.     for(int i=l-1;i>=1;i--)             //删除后缀0  
  11.     {  
  12.         if(c[i]!='0')  
  13.             break;  
  14.         l--;  
  15.     }  
  16.     if(c[l-1]=='.')  
  17.         l--;  
  18.     c[l]='\0';  
  19.     //puts("after back->");  
  20.     //puts(c);  
  21. }  
  22. void front(char* c,int &l,bool &f)  
  23. {  
  24.     int cnt = isdigit(c[0]) ? 0 : 1;    //cnt记录前缀0和符号的个数  
  25.     if(c[0]=='-')  
  26.         f = false;  
  27.     for(int i=cnt;i<l-1;i++)            //l-1保证c为整数时留一位整数  
  28.     {  
  29.         if(c[i+1]=='.' || c[i]!='0')    //c[i+1]=='.'保证c为小数时留一位整数  
  30.             break;  
  31.         cnt++;  
  32.     }  
  33.     if(cnt)  
  34.     {  
  35.         for(int i=0;i<l-cnt;i++)        //把字符串整体向前移cnt位  
  36.             c[i] = c[i+cnt];  
  37.         c[l-cnt] = '\0';  
  38.     }  
  39.     //puts("after front->");  
  40.     //printf(f?"+ ":"- ");  
  41.     //puts(c);  
  42. }  
  43. void deal(char *c,bool &f)  
  44. {  
  45.     int l = strlen(c);  
  46.     f = true;                           //f记录符号,初始为正  
  47.     back(c,l);  
  48.     front(c,l,f);  
  49. }  
  50. bool Cmp(char* A,char* B,bool a,bool b)  
  51. {  
  52.     if(strcmp(A,B) == 0)  
  53.     {  
  54.         if(strcmp(A,"0") == 0 || a^b == 0)  
  55.             return true;  
  56.     }  
  57.     return false;  
  58. }  
  59. int main()  
  60. {  
  61.     char A[M],B[M];  
  62.     bool a,b;  
  63.     while(~scanf("%s%s",A,B))  
  64.     {  
  65.         deal(A,a);  
  66.         deal(B,b);  
  67.         puts(Cmp(A,B,a,b)?"YES":"NO");  
  68.     }  
  69.   
  70.     return 0;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值