
第一眼看到这题,就觉得应该没那么简单,肯定有坑,但我还是忍不住去试了试直接判断相等,结果可想而知------WA了。
然后我就自做聪明的用了字符串,也就字符数组,先用memset函数将数组清零,然后再读入数据。。。。
请看错误代码:
但是我忽略了一个问题,那就是\0,读入后末尾会变成‘\0’。而且还有一个需要注意的地方,就是strcmp()这个函数遇到/0就结束比较了。
以上就是我踩的坑,下面讲下我AC的思路:
总体思路:判断是否有小数点,没有就加上小数点,再判断字符串长度是否相等,不相等的话就在短的那个后面加\'0\',直到长度相等位置。
第一点:毫无疑问,这题没有范围,所以数据是可以很大的(可正可负),所以我们应该用字符串
第二点:精度问题肯定要考虑,比如1.0 1.00 1.00之类的
第三点:还可能是有无小数点 比如1 1.0 1.00
先附上C++代码,简单明了。
#include<iostream>
using namespace std;
int main()
{
string a, b;
while(cin>>a>>b)
{
if(a == b)
{
cout<<"YES"<<endl;
}
else
{
bool ans = false;
if(a.length() < b.length())
{
for(string::iterator i = a.begin(); i != a.end(); i++)
{
if(*i == \'.\')
{
ans = true;
}
}
if(!ans)
{
a+=".";
}
while(a.length()!=b.length())
{
a += "0";
}
}
else if(a.length()>b.length())
{
for(string::iterator i = b.begin(); i != b.end(); i++)
{
if(*i==\'.\')
{
ans = true;
}
}
if(!ans)
{
b+=".";
}
while(a.length()!=b.length())
{
b += "0";
}
}
if(a==b)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}
然后我又跟着这个思路用C写了一下
#include <cstdio>
#include <cstring>
#define MAX 1000005
char a[MAX], b[MAX];
int main()
{
while(~scanf("%s%s", a, b))
{
int len_a = strlen(a);
int len_b = strlen(b);
bool ans_a = true;
bool ans_b = true;
if(len_a != len_b)
{
for(int i = 0; i < len_a; i++)
{
if(a[i] == \'.\')
{
ans_a = false;
}
}
if(ans_a)
{
a[len_a] = \'.\';
}
for(int i = 0; i < len_b; i++)
{
if(b[i] == \'.\')
{
ans_b = false;
}
}
if(ans_b)
{
b[len_b] = \'.\';
}
if(strlen(a) < strlen(b))
{
if(ans_a)
{
for(int i = len_a + 1; i < strlen(b); i++)
{
a[i] = \'0\';
}
}
else
{
for(int i = len_a; i < strlen(b); i++)
{
a[i] = \'0\';
}
}
}
if(strlen(a) > strlen(b))
{
if(ans_b)
{
for(int i = len_b + 1; i < strlen(a); i++)
{
b[i] = \'0\';
}
}
else
{
for(int i = len_b; i < strlen(a); i++)
{
b[i] = \'0\';
}
}
}
}
if(strcmp(a, b) == 0)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
C实在是太不方便了,ACM主流也是C++,我正在慢慢从C到C++转化。