hdu 2054 A==B? 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2054
模拟(似乎已经可以不算太水了)
题目大意:输入两个数,判断两个数是否相等,相等输出YES,反之NO。
题目分析:小数点,会有的;正负号,会有的;前导0,会有的;小数点后的末尾0,也会有的(好像就这么些了,也不多,是吧)。我的思想是把正负号、前导后继什么的都去掉,小数点按位统一并去掉,短的补0,然后比较剩余部分,一致的话再看符号。
#include<iostream>
#include<string>
using namespace std;
int main()
{
int i,j,dt1,dt2;
bool sy1,sy2,flag1,flag2;
string s1,s2;
while(cin>>s1>>s2)
{
dt1=dt2=-1;
flag1=flag2=sy1=sy2=true;//true为正
if(s1[0]=='-')sy1=false,s1.erase(0,1);
if(s2[0]=='-')sy2=false,s2.erase(0,1);
if(s1[0]=='+')sy1=true,s1.erase(0,1);
if(s2[0]=='+')sy2=true,s2.erase(0,1);
while(s1[0]=='0')s1.erase(0,1);
while(s2[0]=='0')s2.erase(0,1);
if(s1.find('.',0)>=0&&s1.find('.',0)<s1.size())
while(s1[s1.size()-1]=='0')s1.erase(s1.size()-1,1);
if(s2.find('.',0)>=0&&s2.find('.',0)<s2.size())
while(s2[s2.size()-1]=='0')s2.erase(s2.size()-1,1);
for(i=0;i<s1.size()&&dt1==-1;i++)
{
if(s1[i]=='.')s1.erase(i,1),dt1=s1.size()-i;
}
for(i=0;i<s2.size()&&dt2==-1;i++)
{
if(s2[i]=='.')s2.erase(i,1),dt2=s2.size()-i;
}
if(dt1==-1)dt1++;
if(dt2==-1)dt2++;
if(dt1>dt2)s2.append(dt1-dt2,'0');
else s1.append(dt2-dt1,'0');
//cout<<"s1 == "<<s1<<endl;
//cout<<"s2 == "<<s2<<endl;
//cout<<"dt1 == "<<dt1<<" dt2== "<<dt2<<endl;
if(s1.empty()&&s2.empty()||s1==s2&&sy1==sy2)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
PS:以前的一道题,当时(13年4月8号下午)极其菜,一看以为是跟A+B一个等级的题,3wrong,看discuss被吓退。今日重写居然没wrong一条过O(∩_∩)O~!
PPS:这道题可以算是中等模拟,大模拟是poj3760那种,现在还不敢想。
PPPS:后来发现,这样的代码居然也能A……
# include <stdio.h>
# include <string.h>
char *norm(char *a)
{
int len=strlen(a);
if(strchr(a,'.')!=NULL)
{
while(a[--len]=='0');
if(a[len]=='.')
len--;
a[len+1]='\0';
}
return a;
}
int main()
{
char a[12001],b[12001];
while(scanf("%s%s",a,b)!=EOF)
{
if(!strcmp(norm(a),norm(b)))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
也就是说,前导0没有,正负号其实也是没有的…………