A-B Problem
时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述
A+B问题早已经被大家所熟知了,是不是很无聊呢?现在大家来做一下A-B吧。
现在有两个实数A和B,聪明的你,能不能判断出A-B的值是否等于0呢?
输入
有多组测试数据。每组数据包括两行,分别代表A和B。
它们的位数小于100,且每个数字前中可能包含+,- 号。
每个数字前面和后面都可能有多余的0。
每组测试数据后有一空行。
输出
对于每组数据,输出一行。
如果A-B=0,输出YES,否则输出NO。
样例输入
1
1
1.0
2.0
样例输出
YES
NO
此题需要把小数点前面的位和后面的值分开,在除了符号位的情况下,只要判断其余位数都相等的话,符号位就好说了。
注意 :如果两个数都是0的话,不管符号位是什么都相等
以下附上代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<stack>
#include<math.h>
#include<map>
using namespace std;
char a[105],b[105];
char aq[105],ah[105],bq[105],bh[105];
int i,j;
int main()
{
while(~scanf("%s%s",a,b))
{
int la=strlen(a);
int lb=strlen(b);
int dian1=la,dian2=lb;
for(i=0; i<la; i++)
{
if(a[i]=='.')
{
dian1=i;
break;
}
}
for(i=0; i<lb; i++)
{
if(b[i]=='.')
{
dian2=i;
break;
}
}
int k1=0,k2=0,k3=0,k4=0;
memset(aq,'0',sizeof(aq));
memset(ah,'0',sizeof(ah));
memset(bq,'0',sizeof(bq));
memset(bh,'0',sizeof(bh));
for(i=dian1+1; i<la; i++)
ah[k1++]=a[i];
for(i=dian2+1; i<lb; i++)
bh[k2++]=b[i];
if(a[0]=='+'||a[0]=='-')
for(i=dian1-1; i>=1; i--)
aq[k3++]=a[i];
else
for(i=dian1-1; i>=0; i--)
aq[k3++]=a[i];
if(b[0]=='+'||b[0]=='-')
for(i=dian2-1; i>=1; i--)
bq[k4++]=b[i];
else
for(i=dian2-1; i>=1; i--)
bq[k4++]=b[i];
int lh=max(k1,k2);
int lq=max(k3,k4);
int t1=0,t2=0;
for(i=0,j=1; i<lh,j<lq; i++,j++)
{
if(ah[i]!=bh[i]||aq[j]!=bq[j])
{
t1=1;
break;
}
}
// printf("t1==%d\n",t1);
int t3=0,t4=0;
for(i=0,j=0; i<lh,j<lq; i++,j++)
{
if(ah[i]!='0'||aq[j]!='0')
t3=1;
if(bh[i]!='0'||bq[j]!='0')
t4=1;
}
// printf("t3=%d t4=%d\n",t3,t4);
if(t3==0&&t4==0)
printf("YES\n");//判断当两个数都是0的时候,因为如果都是0的话,无论两个数是正数还是负数,都相等
else
{
if(t1==1)//除了符号外,其余位都相等,接下来只需要判断符号就可以了
printf("NO\n");
else
{
if(a[0]=='+'&&b[0]=='-')
printf("NO\n");
else if(a[0]=='-'&&(b[0]>='0'&&b[0]<='9'))
printf("NO\n");
else if(b[0]=='+'&&a[0]=='-')
printf("NO\n");
else if(b[0]=='-'&&(a[0]>='0'&&a[0]<='9'))
printf("NO\n");
else
printf("YES\n");
}
}
}
}