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