#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
本文介绍了一种使用C++实现的从十六进制到二进制再到八进制的转换方法。通过使用switch语句来提高效率,并对转换过程进行了详细说明。

被折叠的 条评论
为什么被折叠?



