PIPIOJ 1114 十六进制转换 (STL)

16进制转8进制,以二进制为桥梁,用两个map转换一下即可,然而我没想到,菜。

涉及一些我不会的string用法。

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
const int N = 1e5+7;
string s;
unordered_map<char, string >mp1;//16->2
unordered_map<string, char >mp2;//2->8
int main() {
	mp1['0'] = "0000", mp1['1'] = "0001", mp1['2'] = "0010", mp1['3'] = "0011";
	mp1['4'] = "0100", mp1['5'] = "0101", mp1['6'] = "0110", mp1['7'] = "0111";
	mp1['8'] = "1000", mp1['9'] = "1001", mp1['A'] = "1010", mp1['B'] = "1011";
	mp1['C'] = "1100", mp1['D'] = "1101", mp1['E'] = "1110", mp1['F'] = "1111";

	mp2["000"] = '0', mp2["001"] = '1', mp2["010"] = '2', mp2["011"] = '3';
	mp2["100"] = '4', mp2["101"] = '5', mp2["110"] = '6', mp2["111"] = '7';
	while (cin >> s) {
		string t, ans;
		for (int i = 0; i < s.size(); i++) {
			t = t + mp1[s[i]];
		}
		if (t.size() % 3 == 1)t = "00" + t;
		else if (t.size() % 3 == 2)t = "0" + t;
		for (int i = 0; i < t.size(); i+=3) {
			ans = ans + mp2[t.substr(i, 3)];//提取字符
		}
		bool flag = false;
		for (int i = 0; i < ans.size(); i++) {
			if (ans[i] == '0' && !flag)continue;
			flag = true;
			printf("%c", ans[i]);
		}
		printf("\n");
		s.clear();
	}
	return 0;
}

一.string相关

string str(10,'a');
str.size();
str.length()//两个函数效果一样

substr 成员函数可以用于求子串 (n, m)

string s1,s2;
s2=s1.substr(2);//提取出str的下标为2到末尾,给str1
str1=str.substr(2,3);//提取出str的下标为2开始,提取三个字符,给str1

可直接用 ‘+’来拼接字符串。

二.思路波动过程

题做的太少了,看了提示才做下来,没啥好说的。

需要注意的是二进制转八进制时,需要补位的问题,三位二进制对应一位八进制,即可用字符串大小模3来判断需补几位。
余1说明空缺两位,余2相反,我给搞混了,这里要想深一点。

2020/2/17

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章