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; }
相关文章推荐
- hdu 2054 A == B ? (java)
- 模拟_大数字符串(HDU_2054)
- HDU 2054 A == B ?
- Hdu 2054 - A == B ?
- hdu 2054
- hdu 2054 A == B ?
- HDU 2054
- HDU 2054 A == B ?
- HDU 2054 判断大数是否相等
- HDU 2054 A == B ?(找小数点)
- HDU-2054
- HDU 2054 A == B ?
- HDU 2054 A == B?
- HDU 2054
- hdu 2054A==B?
- hdu 2054
- hdu 2054 A == B?
- HDU 2054 JAVA
- hdu 2054 A == B ? (java大数)
- hdu 2054 (典型字符串模拟)