总结:这个题WA了好多次,从一开始只是简单认为比较两个实数,到后来用字符串表示,由于想得太少而一错再错,总的来说这个题需要注意以下几点:
1.注意正负性
2.注意小数点的存在,这又分为整数+小数点+0后缀,小数两种形式
3.注意前缀0,和小数状态下的后缀0,需要把它们删除
4.用C++时,一些情况下,最好用scanf和printf输入输出,别用cin和cout了,这样可以节省一定时间,防止因超时而出错,有一个链接,就是讲这方面知识的,不过访问时有些慢,请耐心等待https://discuss.codechef.com/questions/7585/why-do-i-get-a-time-limit-exceeded
附代码如下:
#include<cstdio>
#include<cstring>
#define maxn 1001000
char a[maxn], b[maxn];
void simplify(char s[])
{
int len = strlen(s);
int i;
char p = '.';
if(s[0] == '+')
s[0] = '0';
if(strchr(s, p)) /*如果这个数有小数点*/
{
while(s[0] == '0') /*前缀有零,省略它*/
{
for(i = 0; i < len; i++)
s[i] = s[i+1]; /*前移*/
s[i] = '\0';
len--;
}
while(s[len-1] == '0') /*后缀有零,省略它*/
{
len--;
s[len] = '\0';
}
if(s[len] == '\0' && s[len-1] == '.') /*末尾只剩小数点,省略它*/
{
len--;
s[len] = '\0';
}
}
if(s[0] == '-')
{
while(s[1] == '0')
{
for(i = 1; i < len; i++)
s[i] = s[i+1]; /*前移*/
len--;
}
}
}
int main()
{
while(scanf("%s%s",a, b) != EOF)
{
simplify(a);
simplify(b);
if(strcmp(a, b) == 0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}