十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
#include<bits/stdc++.h>
using namespace std;
int n;
string heList[16]=
{
"0000","0001","0010","0011", //0-3
"0100","0101","0110","0111", //4-7
"1000","1001","1010","1011", //8-A
"1100","1101","1110","1111", //B-F
};
string octalList[8]=
{
"0","1","2","3",
"4","5","6","7",
};
string HextoTwo(string s) //十六进制转二进制
{
int len = s.length();
string ans;
for(int i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9'){
int index = s[i]-'0';
ans.append(heList[index]);
}else if(s[i]>='A'&&s[i]<='Z'){
int index = s[i]-'0'-7; //A~F转换成数字
ans.append(heList[index]);
}
}
return ans;
}
string TwotoOctal(string s) //二进制转八进制
{
reverse(s.begin(),s.end());
while((s.length()%3)!=0){
s.append("0"); //补0
}
string ans;
int len = s.length();
for(int i=0;i<len;i+=3){
int index = 0;
int t = 0;
while(index<3){
t+=(s[index+i]-'0')*pow(2,index);
index++;
}
ans.append(octalList[t]);
}
reverse(ans.begin(),ans.end());
return ans.substr(ans.find_first_not_of('0'));
}
int main()
{
string ans[20];
cin>>n; //输入行数
getchar();//清除回车符
for(int i =0;i<n;i++)
{
string s;
getline(cin,s);
string tmp = HextoTwo(s);//16->2
ans[i] = TwotoOctal(tmp);//2->8
}
for(int i=0;i<n;i++)
{
cout<<ans[i]<<endl;
}
}