十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
思路
由于有时间限制,使用十进制转换会超时,所以使用二进制转换。
首先如果十六进制位数不足3的倍数要在前面补0,然后每3位数转换为12个二进制,再对应4个八进制数。
注意:输出时判断从第一个非零数开始;为了减少存储每转换3位十六进制就输出一次。
代码
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main()
{
int i,j,k=0,l,n,fuzhu,length,sc;
string str,str2,from16to2[16]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
cin>>n;
for(i=0;i<n;i++)
{
l=0;
cin>>str;
if(str.length()%3==1)
str="00"+str;
if(str.length()%3==2)
str="0"+str;
length=str.length();
for(j=0;j<length;j+=3)
{
if(str[j]<='9')fuzhu=str[j]-'0';
else fuzhu=str[j]-'A'+10;
str2=from16to2[fuzhu];
if(str[j+1]<='9')fuzhu=str[j+1]-'0';
else fuzhu=str[j+1]-'A'+10;
str2+=from16to2[fuzhu];
if(str[j+2]<='9')fuzhu=str[j+2]-'0';
else fuzhu=str[j+2]-'A'+10;
str2+=from16to2[fuzhu];
for(k=0;k<12;k+=3)
{
sc=4*(str2[k]-'0')+2*(str2[k+1]-'0')+(str2[k+2]-'0');
if(sc!=0)l=1;
if(l)cout<<sc;
}
}
cout<<endl;
}
return 0;
}