1. 程式人生 > >hdu2054 不要想太多,這就一水題

hdu2054 不要想太多,這就一水題

原題連結

我早該想到這是一道水題,因為這道題在杭電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”
注意擷取子串操作對於原字串不會產生影響!