思路
因为这里十六进制的位数太多,导致如果转化成十进制后,任何基本数据类型都无法定义,所以才去字符串读入该十六进制数,又因为十六进制可以先转化为二进制,然后二进制再转化为八进制,这样中间全部利用字符串完成,最终通过一个if语句特判完成前导0的删除。
AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main(){
int n;
cin >> n;
string s,t;
while(n--){
cin >>s;
t="";
for(int i = 0; i < s.length(); i++)
{
switch (s[i])
{
case '0': t+="0000";break;
case '1': t+="0001";break;
case '2': t+="0010";break;
case '3': t+="0011";break;
case '4': t+="0100";break;
case '5': t+="0101";break;
case '6': t+="0110";break;
case '7': t+="0111";break;
case '8': t+="1000";break;
case '9': t+="1001";break;
case 'A': t+="1010";break;
case 'B': t+="1011";break;
case 'C': t+="1100";break;
case 'D': t+="1101";break;
case 'E': t+="1110";break;
case 'F': t+="1111";break;
}
}
int len = t.length();
if(len % 3==1) t= "00" + t;
else if(len % 3 ==2) t="0"+t;
int flag = 0;
for(int i = 0; i <=t.length() - 3; i+=3){
int ss =(t[i] -'0')*4 +(t[i + 1] - '0')*2 +(t[i + 2]-'0');
if(ss) flag = 1;//这里flag的作用是用来避免第一次出现不是0,而后面有0无法输出的情况
//if(ss) cout << ss; 像这种写法就没有避免中间有0的情况,这样它也不会输出中间的0
if(flag) cout <<ss;
}
cout <<endl;
}
return 0;
}