杭电ACM——2054(A==B?)

这道题看似很简单,但其实如果数据一大,大到long long, double 都不行,就没得办法了。所以这道题要用字符数组来做。
思路是:A,B两个数,先去除一些无效的数字,如0000030,前面那些0就可以去掉,去掉之后比较两者长度是否相等:
1.LEN(A)==LEN(B),直接用strcmp比较;
2.LEN(A)>LEN(B),将B的长度补齐至与A同等长,再用strcmp比较;
3.LEN(A)<LEN(B),将A的长度补齐至与B同等长,再用strcmp比较。
代码如下:

#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
char s1[100005],s2[100005];
int main()
{
	int flag;
	int i,len1,len2,shot;  //len1记录s1的有效长度,len2记录s2,shot标记短的那个字符串
	int start1,start2,dot1,dot2; //start:从前往后扫描,若扫到不为‘0’的字符,开始记录,姑且称为有效部分,dot:标记字符串中是否有小数点
	while(~scanf("%s %s",s1,s2))
	{
		len1=len2=shot=start1=start2=dot1=dot2=0;
		for(i=0;s1[i]!='\0';i++)
		{
			if(s1[i]!='0') start1=1;
			if(s1[i]=='.') dot1=1;
			if(start1)
			{
				    s1[len1++]=s1[i];
			}
		//	else s1[len1++]=s1[i];
		}s1[len1]='\0';   //莫忘
		for(i=0;s2[i]!='\0';i++)
		{
			if(s2[i]!='0') start2=1;
			if(s2[i]=='.') dot2=1;
			if(start2)
			{
	//			if(s2[i]!='0')
				    s2[len2++]=s2[i];
			}
	//		else s2[len2++]=s2[i];
		}s2[len2]='\0';  //莫忘
	//	printf("%s %s\n",s1,s2);
	    if(len1==len2)  //相等,直接比较
	    {
	    	if(strcmp(s1,s2)==0) printf("YES\n");
	    	else printf("NO\n");
		}
		else
		{
			if(len1>len2)
			{
				for(i=len2;i<=len1-1;i++)
				{
					if(!dot2) //没有小数点的情况
					{
						if(i==len2) s2[i]='.';
						else s2[i]='0';
					}
					else s2[i]='0';
				}
				s2[len1]='\0';
			}
			else
			{
				for(i=len1;i<=len2-1;i++)
				{
					if(!dot1)
					{
						if(i==len1) s1[i]='.';
						else s1[i]='0';
					}
					else s1[i]='0';
				}
				s1[len2]='\0';
			}
			if(strcmp(s1,s2)==0) printf("YES\n");
			else printf("NO\n");
		 } 
	}
	return 0;
}

这种做法当遇到像0.23231这种数据时,会变成.23231,但并无大碍。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值