您的位置:首页 > 其它

HDU 2054 A==B?

2017-03-22 22:33 344 查看

题面

Give you two numbers A and B, if A is equal to B, you should print “YES”, or print “NO”.

Input

each test case contains two numbers A and B.

Output

for each case, if A is equal to B, you should print “YES”, or print “NO”.

Sample Input

1 2

2 2

3 3

4 3

Sample Output

NO

YES

YES

NO

大致思路:

极坑的一道题,要考虑各种各样的情况。

比如:

-1000 和 -001000

1.00001000 和1.00001

000.00 和00.000

+0.000 和0

还没给数据范围,所以一定要用字符串处理。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
char a[200000],b[200000];
void front_0(char *str,int len)//处理前导0和正负号
{
bool flag=false;//标记负号是否出现
int j=0;//找到第一个非零数出现的位置,并标记
for(int i=0;i<len;++i){
if(str[i]=='+')
str[i]='0';//遇到+直接变成0
if(str[i]=='-'){
flag=true;
continue;
}
if(str[i]!='0'){
j=i;
break;
}
if(i==len-1){//当i==len-1意味着都是零,所以把后面的0全部去掉,只留第一个。
for(int k=i;k>0;--k)
str[k]='\0';
return ;
}
}
int i;
if(flag)
i=1;
else
i=0;
for(;i<len;++i){//用有意思的数覆盖前导零,用flag来调整不覆盖'-'
str[i]=str[j];
j++;
}
}
void rear_0(char *str,int len)//后导零和小数点的处理
{
int j=len;
for(int i=0;i<len;++i)
if(str[i]=='.'){//出现小数点,标记并跳出
j=i;
break;
}
for(int i=len-1;i>=0;--i){
if(i==j||i<j){//当i出现在这个位置时,说明小数点后没有有意义的数,小数点的存在也就没有意义,进行覆盖。
str[j]='\0';
break;
}
if(str[i]=='0')//无意义的后导零去除
str[i]='\0';
else
break;
}
}
int main()
{
while(cin>>a>>b)
{
int len1=strlen(a);
int len2=strlen(b);
rear_0(a,len1);//顺序不可颠倒,先后后前。
rear_0(b,len2);
front_0(a,len1);
front_0(b,len2);
if(!strcmp(a,b))
cout<<"YES\n";
else
cout<<"NO\n";
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: