原题大致意思是:输入两个数字a和b,如果a=b,则输出“YES”,否则输出“NO”。
这一题看起来定义俩整型变量就行了,不行就long long,或者double,然而,这些函数都是有范围的,也就是说无论你用那个函数来定义变量,而当数值达到一定大小时,总是会溢出的,这也就代表着这些函数是不能用的,起码我不会用。那么,问题来了,既然这些定义数字的函数用不了,那我们要用什么呢?
这时,我们自然而然地会想到字符串,没错,对于一个字符串,就没有溢出之说了。
说到字符串,也就是用string了,而string又有个问题,我们知道数字00201.00与201是相等的,而字符串00201.00和201是不相等的。所以我们要把2前面的0和1后面的0截掉,然后再进行比较。
这样,那么就要找到2前面和1后面最靠近的0的位置,2前面的0可以用2的位置来确定,而1后面的0的位置也可以用1的位置来确定。那么就要用的string类里的find_first_not_of和find_last_not_of函数。光找到位置不够,还要把中间一段截取下来,就要用到substr函数。截取完成后又有问题了0201.00变成了201.和200还是不等。这样就要先判断字符串里有没有小数点,有就正常截取,没有的话就要加个“.”。这就要用到find函数。
经过以上处理后,0201.00变成了201.,201也变成了201.,这样两个字符串就相等了。具体代码如下:
#include<iostream>
#include<string>
using namespace std;
string PrtStr(string a)
{
int b=a.find_first_not_of("0");
int c=a.find_last_not_of("0");
c++;
string d;
d=a.substr(b,c-b);
return d;
}
string PD(string::size_type a,string b)
{
a=b.find(".");
if(a!=b.npos)return b;
elsereturn b+".";
}
int main()
{
string a,b;
while(cin>>a>>b)
{
string::size_type m;
a=PD(m,a);
b=PD(m,b);
string c=PrtStr(a);
string d=PrtStr(b);
if(c==d)cout<<"YES\n";
elsecout<<"NO\n";
}
return 0;
}
代码贴完,再来具体说一下这些函数的用法吧:
***使用这些函数是需要引入头文件string的,即#include<string>
(1)find_first_not_of与find_last_not_of:这两个函数用法一样,就以find_first_not_of为例吧。这个函数出现的形式是str.find_first_not_of(str1),意思是在字符串str里查找字符串str1,其返回值为int型常数,表示字符串str的第几个字符是第一个不是str1里的字符(注意,之前的子字符串不一定是完整的str1,只要是str1里有的字符都会自动跳过,直到找到str里有的而str1里没有的字符为止,而从左往右的第一个字符记作0(这只是我自己的理解))。
(2)substr:这个函数是用于截取字符串的,那么其返回值理所当然是字符串了。出现的形式为:str.substr(int1,int2),str是被截的字符串,int1和int2是两个int型常量,int1是截取的第一个字符在str中的位置(str从左往右第一个字符还是记作0),int2是截取的字符串的长度,也就是说子字符串是str的第int1位字符开始向右取int2个字符得到的字符串。
(3)find:它是判断字符串中是否含有某个子字符串,出现形式为str.find(str1),其返回值是一个string::size_type的数据(我也不知道是啥),当确认含有的时候(必须是整个str1字符串,而不是str1含有的某个字符),它返回str1第一个字符在str中的位置(同上。。。)如果确认不含的时候,它返回npos(出现形式为str.npos)。
基本上就这么多了。。。