蓝桥网 十六进制转八进制

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
#include <stdlib.h>
using namespace std;
int n;
int main()
{
    ios::sync_with_stdio(false);  //加快读取速度
    cin>>n;
    while(n--)
    {   string A,B;
        cin>>A;
        for(long long i=0;i<A.size();i++)
        {
           switch(A[i])       //这里是个小重点 用switch语句代替if else语句会节省时间,本题用if语句会超时
           {
               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;
           }
        }                                //此时已经将十六进制数转变为二进制数
        long long len=B.size();          
        if(len%3==1) B="00"+B;   
         else if(len%3==2) B="0"+B;      //将二进制数位数补齐为3的倍数,方便下面转换为八进制
         int flag=0;
       for(long long i=0;i<=B.size()-3;i=i+3)
       {
           int t=(B[i]-'0')*2*2+(B[i+1]-'0')*2+(B[i+2]-'0');   //每三位二进制数对应一个八进制数 
           if(t) flag=1;       //判断前导是否为0 若是0 不输出
           if(flag) cout<<t;
       }
       cout<<endl;
    }
    return 0;
}

此题一个小技巧就是用了switch语句代替if语句 典型的空间换时间 
详情请看链接 https://www.cnblogs.com/idorax/p/6275259.html
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭