
第一眼看到這題,就覺得應該沒那麼簡單,肯定有坑,但我還是忍不住去試了試直接判斷相等,結果可想而知------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++轉化。