hdu2054 不要想太多,這就一水題
阿新 • • 發佈:2019-01-26
原題連結
我早該想到這是一道水題,因為這道題在杭電OJ題庫的第11頁,這一頁基本上全是水題。。。但是看討論區,大家實在想的太多了,沒那麼複雜。。
題目是比較兩個數是否相等,當然也不是直接用等於號=比較兩個整型這麼簡單。因為這也是一道大數題,不過大家也完全沒有必要想的太多!!!我在wa了之後變去討論區看了這題該注意的情況,裡面好多人講了好多種要注意的情況,我嘗試著都考慮到程式裡,結果換來了更多的WA,確實考慮很多情況,寫個完善的程式碼比較困難的。但是後來裡面有人提到了大家都想的得太多了!!!我就試著按他的考慮不多的情況去考慮,結果就AC了。。強烈建議大家注意的地方:
- 只需考慮小數點後有多個0的情況,比如1.000 和 1比較
- 不需要考慮前導0,即不會出現0000100
- 不需考慮正負號,即只有無符號數
- 不會出現這種 .100 這種逆天的資料,即不可能小數點開頭
#include<iostream> using namespace std; #include<string> void trim0(string& b) { int len = b.length(); if(b.find('.')!=string::npos) { for(int i=len-1;b[i]=='0';i--) len--; b=b.substr(0,len); } if(b[len-1]=='.') b=b.substr(0,len-1); } void main() { string a,b; while(cin>>a>>b) { trim0(a); trim0(b); if(a==b) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
可以用這題來熟悉一下string型別的操作,c++中的字串string的本質也是STL中的容器。和其他容器有很多相同的方法,也有push_back、clear這種。而且string提供了較為豐富的函式。我這裡只用到了兩個。 find()方法:查詢字串中是否含有某一字元。也有一個過載方法可以用來查詢字串。如果找不到不是返回-1,而是返回一個static成員-------string::npos; substr()方法:顧名思義,就是用來擷取子串的。以前只知道Java中的String有subString方法可以擷取子串,卻不在c++的String也有。汗顏。 substring(i);會從下標為i的位置擷取到末尾,注意下標從0算起。 substring(a,b);會從下標為a的位置擷取,b是要擷取的長度。貌似大多數語言裡面擷取子串都是這樣的。並不是使用首末位置的下標。 比如:
注意擷取子串操作對於原字串不會產生影響!s=“12345”; s.substring(3);//那麼返回值是“45” s.substring(0,3);//那麼返回值是“123”