蓝桥杯刷题计划,由于最大有十万位16进制数,所以直接选择整形是无法存储的,考虑到16进制,8进制,2进制之间的关系,所以我们选择,先转2进制,再有2进制转换为8进制。
由于,一位16进制数对应4位2进制数,一位8进制数对应3位2进制数,于是,我们可以用先用Map进行一个映射存储,便于直接取用。
另外注意map迭代器的使用方法,还有一个坑点在于如果16进制数转换为2进制字符串后,不是3的倍数,我们需要从高位开始,挨着补0。
注意字符串可以使用push_back操作,但一次放入一个字符,采取字符串+=的方法,时间会比较复杂。
最后,直接上代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; map<char, string> mp; map<string, char> mp2; int main() { mp['0'] = "0000"; mp['1'] = "0001"; mp['2'] = "0010"; mp['3'] = "0011"; mp['4'] = "0100"; mp['5'] = "0101"; mp['6'] = "0110"; mp['7'] = "0111"; mp['8'] = "1000"; mp['9'] = "1001"; mp['A'] = "1010"; mp['B'] = "1011"; mp['C'] = "1100"; mp['D'] = "1101"; mp['E'] = "1110"; mp['F'] = "1111"; int t; cin >> t; while(t--) { string s = "", ans = "", end = ""; cin >> s;//ans代表十六进制转换为2进制,end代表2进制转换为8进制 for(int i = 0; i < s.size(); i++) { for(int j = 0; j < mp[s[i]].size(); j++) { ans.push_back(mp[s[i]][j]); } } while(ans.size() % 3) ans = "0" + ans; for(map<char, string>::iterator it = mp.begin(); it != mp.end(); it++) { if(it->first >= '8') break; char val = it->first; string key = it->second.substr(1, 3); mp2[key] = val; } for(int i = 0; i < ans.size(); i += 3) { string temp = ""; temp.push_back(ans[i]); temp.push_back(ans[i + 1]); temp.push_back(ans[i + 2]); end += mp2[temp]; } for(int i = 0, flag = 0; i < end.size(); i++) { if(!flag && end[i] =='0') continue; flag = 1; cout << end[i]; } cout << endl; } return 0; }