杭電OJ 2054 A == B ?
阿新 • • 發佈:2018-12-16
第一眼看到這題,就覺得應該沒那麼簡單,肯定有坑,但我還是忍不住去試了試直接判斷相等,結果可想而知------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++轉化。