1073. Scientific Notation <string>

3 篇文章 0 订阅

题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1073

string

既然用到了string,我们就回顾一下常用的string接口,每一个接口都有几种重载,只需会用常用的即可。

size()/begin()/end()就不提了。

首先给出一个网址(http://www.com/reference/string/string/),自己经常参考一些C++信息。

1. find()

size_t find (const string& str, size_t pos = 0) const noexcept;
size_t find (const char* s, size_t pos = 0) const;
size_t find (const char* s, size_t pos, size_type n) const;
size_t find (char c, size_t pos = 0) const noexcept;
find返回下标。

各参数:
str: 查找str第一次出现的位置。

s:   查找C语言字符串s第一次出现的位置。

c:   查找字符c第一次出现的位置。

pos: 从pos处开始查找,包括pos。

n:   需要匹配的位数。

因此,我们常用的是:

size_t find (const string& str, size_t pos = 0) const noexcept;
size_t find (const char* s, size_t pos = 0) const;
size_t find (char c, size_t pos = 0) const noexcept;

2. erase()

接口声明见:http://www.cplusplus.com/reference/string/string/erase/

sequence (1)
 string& erase (size_t pos = 0, size_t len = npos);
character (2)
iterator erase (const_iterator p);
range (3)
iterator erase (const_iterator first, const_iterator last);

(1) 按下标删除:区间为[pos, pos+npos); npos为需要删除的数量,pos为开始位置。

(2) 按迭代器删除一个字符:给出迭代器p。

(3) 按迭代器删除一个区间:给出2个迭代器first和last。

其实,如果删除一个字符k,直接使用

str.erase('k');

3. insert()

重载比较多大笑

string (1)
 string& insert (size_t pos, const string& str);
substring (2)
 string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
c-string (3)
 string& insert (size_t pos, const char* s);
buffer (4)
 string& insert (size_t pos, const char* s, size_t n);
fill (5)
 string& insert (size_t pos,   size_t n, char c);
iterator insert (const_iterator p, size_t n, char c);
single character (6)
iterator insert (const_iterator p, char c);
range (7)
template <class InputIterator>
iterator insert (iterator p, InputIterator first, InputIterator last);
initializer list (8)
 string& insert (const_iterator p, initializer_list<char> il);
常用的有:

(1) 在pos处开始插入str。

(3) 在pos处开始插入C语言字符串s。

(4) 在pos处开始插入C语言字符串s的前n位。

(5) 在pos处开始插入n个字符c。两种形式,如果使用0作为下标,他不知道你这个是下标还是迭代器的!

如果在开始插入字符,不应使用:s1.insert(0, n, '0');  在结尾处插入使用s1.insert(s1.end(), n, '0');  其他位置的插入,可以使用下标。 比如:s1.insert(1, n, '0');

4. replace()

这个也不省心。

string (1)
string& replace (size_t pos,        size_t len,        const string& str);
string& replace (const_iterator i1, const_iterator i2, const string& str);
substring (2)
string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);
c-string (3)
string& replace (size_t pos,        size_t len,        const char* s);
string& replace (const_iterator i1, const_iterator i2, const char* s);
buffer (4)
string& replace (size_t pos,        size_t len,        const char* s, size_t n);
string& replace (const_iterator i1, const_iterator i2, const char* s, size_t n);
fill (5)
string& replace (size_t pos,        size_t len,        size_t n, char c);
string& replace (const_iterator i1, const_iterator i2, size_t n, char c);
range (6)
template <class InputIterator>
  string& replace (const_iterator i1, const_iterator i2,
                   InputIterator first, InputIterator last);
initializer list (7)
string& replace (const_iterator i1, const_iterator i2, initializer_list<char> il);
这个的参数分布还是比较有规律的:3个参数(4个的那个目前没用过),前两个为范围,可以是下标或者迭代器,最后有一个是字符串,或者字符。

5. substr()

string substr (size_t pos = 0, size_t len = npos) const;
看起来很简单,确实挺简单:开始位置pos,长度npos。

6.总结

如果用下标,参数pos为开始位置,如果是一个范围npos是长度。如果是迭代器,老老实实范围两端的迭代器。


本题代码

// 这道题目用C的话,做起来比较繁琐。用stl会省事很多
// 使用了find()/erase()/insert()/size()/begin()/end()


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <algorithm>

using namespace std;

int main()
{
	#ifdef ONLINE_JUDGE
	#else
		freopen("E:\\in.txt", "r", stdin);
	#endif

	char buf[10000+10];
	gets(buf);

	string line = buf;
//	cout << "line:" << line << endl;


	if(line[0] == '-')
	{
		cout << '-';
	}
	
	string s1 = line.substr(1, line.find('E', 1)-1);
//	cout << "s1:" << s1 << endl;
	string s2 = line.substr(line.find('E', 1)+1, line.size());
//	cout << "s2:" << s2 << endl;
	int index = atoi(s2.c_str());
//	cout << "index:" << index << endl;

	s1.erase(s1.find('.'), 1);
//	cout << "s1:" << s1 << endl;

	if(index <0)
	{
		index = -index;
		s1.insert(s1.begin(), index, '0');// 在开始处插入index个'0'
		/*---------------------------------------------------------
		  如果在开始插入字符,不应使用:s1.insert(0, index, '0');
		  在结尾处插入使用s1.insert(s1.end(), index, '0');
		  其他位置的插入,可以使用下标。
		  比如:s1.insert(1, index, '0');
		---------------------------------------------------------*/
		
		s1.insert(1, 1, '.');
//		cout << "s1:" << s1 << endl;
		cout << s1 << endl;
	}
	else
	{
		if(s1.size()-1 > index)
		{
			s1.insert(index+1, 1, '.');
		}
		else if(s1.size() == index)
		{
			//nothing
		}
		else
		{
			s1.insert(s1.end(), index+1 - s1.size(), '0');
		}
		cout << s1 << endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值