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”注意截取子串操作对于原字符串不会产生影响!