hdu 2054 A==B?

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没有,正负号其实也是没有的…………






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值