题目链接:http://lx.lanqiao.org/problem.page?gpid=T51
//因为每个十六进制的最大长度不超过十万,所以测试样例的最大肯定是十万,
//所以我们不能将十六进制转换成十进制再转换成八进制,那样会溢出,所以打算转换成二进制
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n,str_len,a[1000000],j,i;
string str,str_1;
while(cin>>n)
{
while(n--)
{
cin>>str;
str_len=str.length();
str_1="";
//将十六进制转换成二进制。
for(j=0;j<str_len;j++)
{
switch(str[j])
{
case '0':str_1+="0000";break;
case '1':str_1+="0001";break;
case '2':str_1+="0010";break;
case '3':str_1+="0011";break;
case '4':str_1+="0100";break;
case '5':str_1+="0101";break;
case '6':str_1+="0110";break;
case '7':str_1+="0111";break;
case '8':str_1+="1000";break;
case '9':str_1+="1001";break;
case 'A':str_1+="1010";break;
case 'B':str_1+="1011";break;
case 'C':str_1+="1100";break;
case 'D':str_1+="1101";break;
case 'E':str_1+="1110";break;
case 'F':str_1+="1111";break;
default:break;
}
}
//修正位数,使得转换后的二进制能够正好3个一组转换成8进制
if(str_1.length()%3==1)
str_1="00"+str_1;
else if(str_1.length()%3==2)
str_1="0"+str_1;
//将二进制转换成八进制
i=0;
for(j=0;j<str_1.length()-1;j=j+3)
{
a[i]=(str_1[j]-'0')*4+(str_1[j+1]-'0')*2+(str_1[j+2]-'0')*1;//每3个一组
i++;
}
for(j=0;j<i;j++)
{
if(a[j]==0&&j==0) //不输出前导0
continue;
else
cout<<a[j];
}
cout<<endl;
}
}
return 0;
}