看了某只这东西写了150+行不太开心,于是徒手撸了33行代码(C++)

原题大致意思是:输入两个数字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)

扫描二维码关注公众号,回复: 202837 查看本文章

{

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)。

基本上就这么多了。。。

猜你喜欢

转载自blog.csdn.net/q1410136042/article/details/52928497