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

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