16进制转2进制再转8进制

蓝桥杯刷题计划,由于最大有十万位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;
}

 

posted @ 2020-09-15 10:26  ACM-Epoch  阅读(260)  评论(0编辑  收藏  举报