【HDU】2054 A == B ?

本文详细解析了HDU ACM比赛中的2054题,通过使用字符数组存储并简化输入的两个数字,实现了精确比较。文章分享了如何处理小数点前后多余的0,以及在字符串比较前的必要简化步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2054

题目:

Problem Description

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

分析:

题目说明是比较A B是否相同 ,但却没说明A、B是否为小数或者范围大小等。这道题需要用数组来存。此外也不能存到数组后,直接对字符串数组进行比较,因为有可能是1.00和1。所以需要对获取到的a、b进行化简,然后再字符串比较。

此外,设置a、b数组的大小,要尽可能大些,之前设小了,超时。后来把数组大小从1000到10000,最终改为100005,才ac的。 

还有,才发现自己曾经的一个问题,自己之前忽略了strlen()在获取输入内容后,末尾带有'\0';所以在循环输入的题,考虑到不被前一数组的值影响,都靠把数组内容重新初始化为' '等,再输入内容,求长度。搞麻烦了很多Orz   实际上直接使用strlen即可。

感谢评论里的3000bookworm网友指出我的问题,发现自己只处理了小数点后的部分可能出现问题,却忽视了小数点前面的部分可能出现问题!目前对代码做了更改,不过以前的代码(放在本文最后)也做保留吧。整体思路为,先判断小数点位置,再分别对小数点前后进行处理。目前能处理:去掉整数部分前多余的0;若无整数位,却有0,则添0;去掉小数部分的多余0;若无小数位,却有小数点,则去除小数点。

代码:

#include <stdio.h>
#include <string.h>
char a[100005],b[100005];
void Simplify(char *a)
{
	int len=strlen(a);
	int i;	// , ok = 0
	int intPart = 0;	//首个非0整数位的位置+1
	int point=-1;	//小数点的位置
	for (i=0; i<len; i++)	
	{
		if (a[i] == '.')		//找到小数点位置,也可以用strstr(a,".")
		{
			point = i;
			break;
		}
		else if (a[i]!='0' && !intPart) //记录整数位首个非0数的位置+1
		{		
			intPart = i+1;
		}
	}
	//printf("%d\n",strstr(a,".")-a);
	
	//处理小数点前的部分
	if (intPart) //去除整数中非0位前的0
	{	
		for (i=0; i<len-intPart+1; i++)
		{
			a[i] = a[i+intPart-1];
		}
		a[i]='\0';
		point = point+intPart-1;	//修改小数点位置,以便后面处理小数点后的问题(下同)
		len = strlen(a);			//作用同上
	}
	else //无整数部分,只在小数点前添0
	{		
		if (point==0 && len<100004)	//小数点前无0,则添0
		{
			for (i=len; i>0 ; i--)
			{
				a[i] = a[i-1];
			}
			a[0] = '0';
			a[len+1] = '\0';
			len += 1;
		} 
		else if (point != 0) 
		{
			for (i=1; i<len-point+1; i++)
			{
				a[i] = a[i+point-1];
			}
			a[0] = '0';
			a[i] = '\0';
			len = strlen(a);
		}
		point = 1;
	}
	//printf("\nintPart=%d,%s\n",intPart,a);
	if (point > 0)		//处理小数点后部分
	{
		for (i=len-1; i>=0; i--)//化简处理
		{
			if (a[i] == '0')a[i]='\0';
			else break;
		}//从后往前看。一直是0,则去掉0  继续循环,直到遇到非零,跳出循环
		if (a[i] == '.') a[i]='\0';//(小数点后全为0,则)去掉小数点
	}
}
int main()
{
	while (scanf("%s %s",&a,&b) != EOF)
	{
		Simplify(a);
		Simplify(b);
		if (strcmp(a,b)) printf("NO\n");
		else printf("YES\n");
	}
	return 0;
}

之前的错误代码:

下面的代码,只能对小数点后的多余0、无小数部分的情况作出处理。

#include <stdio.h>
#include <string.h>
char a[100005],b[100005];
void Simplify(char *a)
{
	int len=strlen(a);
	int i,ok=0;
	for (i=0; i<len; i++)//找到小数点位置,也可以用strstr(a,".")
	{
		if (a[i] == '.'){ ok=1; break;}
	}
	//printf("%d\n",strstr(a,".")-a);
	if (ok)
	{
		for (i=len-1; i>=0; i--)//化简处理
		{
			if (a[i] == '0')a[i]='\0';
			else break;
		}//从后往前看。一直是0,则去掉0  继续循环,直到遇到非零,跳出循环
		if (a[i] == '.') a[i]='\0';//(小数点后全为0,则)去掉小数点
	}
}
int main()
{
	while (scanf("%s %s",&a,&b) != EOF)
	{
		Simplify(a);
		Simplify(b);
		if (strcmp(a,b)) printf("NO\n");
		else printf("YES\n");
	}
	return 0;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值