题目链接: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;
}