HDU - 2054 A == B ?(string操作复习)

Give you two numbers A and B, if A is equal to B, you should print "YES", or print "NO". 

Input

each test case contains two numbers A and B. 

Output

for each case, if A is equal to B, you should print "YES", or print "NO".

Sample Input

1 2
2 2
3 3
4 3

Sample Output

NO
YES
YES
NO

题面上不说数据范围,也没有说数据类型,事实就是数据范围巨大,整型实型都有,所以必须用字符串去写,但是又涉及到小数,所以还要删除小数后面多余的0,比如1==1.0000,这是yes,0==0.0这也是yes,所以只需要删除后导0以及后导0删完了如果还有小数点,那小数点也要删除,比如1.0000应该变成1.

这里用的是string而不是字符型数组,因为进行删除操作比较简便。


顺便对string类型操作复习一遍(复习(review)与预习(preview)之间有什么区别呢?P的区别):a.find(),a.erase(),a.end()···

a) string s; //生成一个空字符串s 
b) string s(str) //拷贝构造函数 生成str的复制品 
c) string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值 
d) string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值 
e) string s(cstr) //将C字符串作为s的初值 
f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。 
g) string s(num,c) //生成一个字符串,包含num个c字符 
h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值 
i) s.~string() //销毁所有字符,释放内存

2.字符串操作函数 
这里是C++字符串的重点 
1) =,assign() //赋以新值 
“=”的用法不作详细说明,assign用法如下:

# include <iostream>
# include <string>
using namespace std;
int main()
{
    string str1 = "yesterday once more";
    string str2 ("my heart go on");
    string str3,str4;

    str3.assign(str2,3,6);  // = heart
    str4.assign(str2,3,string::npos); // = heart go on (从2开始到结尾赋给str4)
    str4.assign("gaint"); // =gaint
    str4.assign("nico",5); // = nico,超出长度会发生什么。。。
    str4.assign(5,'x'); // = xxxxx
    cout<<str4<<endl;

    getchar();
    return 0;
}


2) swap() //交换两个字符串的内容 
用法如下:

# include <iostream>
# include <string>
using namespace std;
int main()
{
    string str1 = "yesterday once more";
    string str2 ("my heart go on");

    str2.swap(str1);
    cout<<str1<<endl; // = my heart go on
    cout<<str2<<endl; // = yesterday once more

    getchar();
    return 0;
}


3) +=,append(),push_back() *//在尾部添加字符* 
增加字符(这里说的增加是在尾巴上),函数有 +=、append()、push_back()。举例如下: 
s+=str;//加个字符串 
s+=”my name is jiayp”;//加个C字符串 
s+=’a’;//加个字符 
s.append(str); 
s.append(str,1,3);//不解释了同前面的函数参数assign的解释 
s.append(str,2,string::npos)//不解释了 
s.append(“my name is jiayp”); 
s.append(“nico”,5); 
s.append(5,’x’); 
s.push_back(‘a’);//这个函数只能增加单个字符

4) insert() //插入字符** 
在string中间的某个位置插入字符串,可以用insert()函数,这个函数需要指定一个安插位置的索引,被插入的字符串将放在这个索引的后面。 
s.insert(0,”my name”); 
s.insert(1,str); 
这种形式的insert()函数不支持传入单个字符,这时的单个字符必须写成字符串形式。注意:为了插入单个字符,insert()函数提供了两个对插入单个字符操作的重载函数:insert(size_type index,size_type num,chart c)和insert(iterator pos,size_type num,chart c)。其中size_type是无符号整数,iterator是char*,所以,这么调用insert函数是不行的:insert(0,1, ’j’);这时候第一个参数将转换成哪一个呢?所以必须这么写:insert((string::size_type)0,1,’j’)!第二种形式指出了使用迭代器安插字符的形式,在后面会提及。顺便提一下,string有很多操作是使用STL的迭代器的,他也尽量做得和STL靠近。 
5) erase() //删除字符**

s.erase(13);//从索引13开始往后全删除 
s.erase(7,5);//从索引7开始往后删5个 

6) clear() //删除全部字符** 
用法不作说明; 
7) replace() //替换字符** 
string s=”il8n”; 
s.replace(1,2,”nternationalizatio”);//从索引1开始的2个替换成后面的 
C_string s = internationalization 
8) + //串联字符串** 
9) ==,!=,<,<=,>,>=,compare() //比较字符串 
C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较(如 str<”hello”)。在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。 
另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果,返回值意义如下:0-相等 >0-大于 <0-小于。举例如下: 
string s(“abcd”); 
s.compare(“abcd”); //返回0 
s.compare(“dcba”); //返回一个小于0的值 
s.compare(“ab”); //返回大于0的值 
s.compare(s); //相等 
s.compare(0,2,s,2,2); //用”ab”和”cd”进行比较小于零 
s.compare(1,2,”bcx”,2); //用”bc”和”bc”比较。 
10) size(),length() //返回字符数量 
现有的字符数,函数是size()和length(),他们等效。 
11) max_size() //返回字符的可能最大个数??? 
max_size() 这个大小是指当前C++字符串最多能包含的字符数,很可能和机器本身的限制或者字符串所在位置连续内存的大小有关系。我们一般情况下不用关心他,应该大小足够我们用的。但是不够用的话,会抛出length_error异常 
12) empty() //判断字符串是否为空 
Empty()用来检查字符串是否为空。 
13) capacity() //返回重新分配之前的字符容量 
capacity()重新分配内存之前 string所能包含的最大字符数。 
14) reserve() //保留一定量内存以容纳一定数量的字符 
这个函数为string重新分配内存。重新分配的大小由其参数决定,默认参数为0,这时候会对string进行非强制性缩减。 
15) [ ], at() //存取单一字符 
可以使用下标操作符[]和函数at()对元素包含的字符进行访问。但是应该注意的是操作符[]并不检查索引是否有效(有效索引0~str.length()),如果索引失效,会引起未定义的行为。而at()会检查,如果使用 at()的时候索引无效,会抛出out_of_range异常。

   string str1 = "Iphone 5";
   cout<<str1[2]<<endl; // = h
   cout<<str1.at(4)<<endl; // = n

    string stuff;
    getline(cin,stuff); // 输入一行字符赋值给stuff
    getline(cin,stuff,'!'); // 输入一行字符以“!”结束
    cout<<stuff<<endl;


16) >>,getline() //从stream读取某值 
17) << //将谋值写入stream 
18) copy() //将某值赋值为一个C_string 
c_str() //将内容以C_string返回 
data() //将内容以字符数组形式返回 
C ++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy(),其中,data()以字符数组的形式返回字符串内容,但并不添加’\0’。c_str()返回一个以‘\0’结尾的字符数组,而copy()则把字符串的内容复制或写入既有的c_string或字符数组内。C++字符串并不以’\0’结尾。我的建议是在程序中能使用C++字符串就使用,除非万不得已不选用c_string。 
19) substr() //返回某个子字符串 
substr(),形式如下: 
s.substr();//返回s的全部内容 
s.substr(11);//从索引11往后的子串 
s.substr(5,6);//从索引5开始6个字符 
20)查找函数 
查找函数很多,功能也很强大,包括了: 
find() 
rfind() 
find_first_of() 
find_last_of() 
find_first_not_of() 
find_last_not_of() 
这些函数返回符合搜索条件的字符区间内的第一个字符的索引,没找到目标就返回npos。
所有的函数的参数说明如下: 
第一个参数是被搜寻的对象。第二个参数(可有可无)指出string内的搜寻起点索引,第三个参数(可有可无)指出搜寻的字符个数。比较简单,不多说不理解的可以向我提出,我再仔细的解答。当然,更加强大的STL搜寻在后面会有提及。 
最后再说说npos的含义,string::npos的类型是string::size_type,所以,一旦需要把一个索引与npos相比,这个索引值必须是string::size)type类型的,更多的情况下,我们可以直接把函数和npos进行比较(如:if(s.find(“jia”)== string::npos))。

# include <iostream>
# include <string>

using namespace std;
int main()
{
    string str = "when i was young, i listen to radio.";
    string::size_type position;

    position  = str.find("listen");

    if (position != str.npos) //npos是个很大的数,如果没找到就会返回npos的值给position
    {
        cout<<"第一次出现的下标是:"<<position<<endl;
    }

    //从字符串下标9开始,查找字符串you,返回you 在str中的下标
    position = str.find("you",9);
    cout<<"str.find("you",9")is:"<<position<<endl;

    //查找子串出现的所有位置
    string substr = "i";
    position = 0;
    int i = 1;
    while((position = str.find_first_of(substr,position)) != string::npos)
    {
        cout<<"position "<<i++<<position<<endl;
        position++;
    }

    //反向查找子串在str中最后出现的位置
    string flag = "to";
    position = str.rfind(flag);
    cout<<"str.rfind(flag):"<<position<<endl;
    getchar();
    return 0;
}


21)begin() end() //提供类似STL的迭代器支持

# include <iostream>
# include <string>
# include <algorithm>
using namespace std;
int main()
{
    string str;

    str.push_back('Q');
    str.push_back('A');

    sort(str.begin(),str.end());
    string::iterator itstr = str.begin();

    for ( ; itstr != str.end(); itstr++)
    {
        cout<<*itstr;
    }   

    //str.pop_back();

    getchar();
    return 0;   //输出AQ
}


22) rbegin() rend() //逆向迭代器 
23) get_allocator() //返回配置器
 


 

hdu-2054代码如下:

#include <iostream>
#include <cstdio>
#include "cstring"
#include "algorithm"
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <map>
#include <unordered_map>//Hash_map:因为标准化的推进,hash_map属于非标准容器,未来将要用:boost中tr1中的unordered_map替代之
using namespace std;
const int Maxn=1000;

string a,b;
void delete0(){
    if (a.find(".")!=string::npos) {
        for (int i=(int)a.length()-1; i>=0; i--) {
            if(a[i]=='0')
                a.erase(a.end()-1);
            else if(a[i]=='.'){
                a.erase(a.end()-1);
                break;
                
            }
            else break;
        }
    }
    if (b.find(".")!=-1) {
        for (int i=(int)b.length()-1; i>=0; i--) {
            if(b[i]=='0')
               b.erase(b.end()-1);
            else if(b[i]=='.'){
                b.erase(b.end()-1);
                break;
                
            }
            else break;
        }
    }
}

int main(int argc, const char * argv[]) {
    
    while (cin>>a>>b) {
        delete0();
        if(a==b)printf("YES\n");
        else printf("NO\n");
    }
    
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值