16进制转化8进制---map

#include "stdio.h"
#include "string.h"
#include "string"
#include "iostream"
#include "math.h"
#include "map"
#include "queue"
#include "malloc.h"
using namespace std;
map<char,string> mp;

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 a;
    char test[100005];
    cin >> a;
    while(a--)
    {
        
        memset(test,0,sizeof(test));
        string b="";
        cin>>test;
        for(int i = 0;i < strlen(test);i++)
        {
            b += mp[test[i]];
        }
        int len = b.length();
        if(len%3==1)
            b = "00" + b;  
        else if(len%3==2)  
            b = "0" + b;
        int flag = 0;
        for(int i = 0 ;i < b.length(); i = i + 3)
        {
            int num = 4*(b[i]-'0')+2*(b[i+1]-'0')+(b[i+2]-'0');
            if(num)
                flag = 1;
            if(flag)
                cout<<num;
            
        }
        cout<<endl;
    }
    return 0;
}

但是这个跑在蓝桥杯的题目中会超时,因为map查询是对数时间复杂度放在循环中会超时

更改map后通过

#include "stdio.h"
#include "string.h"
#include "string"
#include "iostream"
#include "math.h"
#include "map"
#include "queue"
using namespace std;
map<char,string> mp;

int main()
{
    int a;
    string test;
    cin >> a;
    while(a--)
    {
        string b="";
        cin>>test;
        for(int i=0;i<test.length();i++)//遍历,字符串上加上每一位  
        {  
            switch(test[i])  
            {  
                case '0':b+="0000";break;  
                case '1':b+="0001";break;  
                case '2':b+="0010";break;  
                case '3':b+="0011";break;  
                case '4':b+="0100";break;  
                case '5':b+="0101";break;  
                case '6':b+="0110";break;  
                case '7':b+="0111";break;  
                case '8':b+="1000";break;  
                case '9':b+="1001";break;  
                case 'A':b+="1010";break;  
                case 'B':b+="1011";break;  
                case 'C':b+="1100";break;  
                case 'D':b+="1101";break;  
                case 'E':b+="1110";break;  
                case 'F':b+="1111";break;  
                default:break;  
            }  
        }  
        int len = b.length();
        if(len%3==1)
            b = "00" + b;  
        else if(len%3==2)  
            b = "0" + b;
        int flag = 0;
        for(int i = 0 ;i < b.length(); i = i + 3)
        {
            int num = 4*(b[i]-'0')+2*(b[i+1]-'0')+(b[i+2]-'0');
            if(num)
                flag = 1;
            if(flag)
                cout<<num;
        }
        cout<<endl;
    }

    return 0;
}
原文地址:https://www.cnblogs.com/cc-xiao5/p/8567075.html