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