十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
思路:刚开始想把十六进制转换成十进制,然后再转换成八进制,但因数据过大无法实现,于是便采用了字符串的方式,将十六进制数先转换成二进制,然后再转换成八进制,成功通过。
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=0; i<n; i++)
{
string a,b="",c="";
string x[16]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
string y[8]={"000","001","010","011","100","101","110","111"};
cin>>a;
for(int j=0;j<a.length();j++)
{
if(a[j]>='0'&&a[j]<='9')
b+=x[a[j]-'0'];
else{b+=x[a[j]-'A'+10];}
}//将十六进制转换成二进制
int add=b.length()%3;
switch(add)
{
case 2:b.insert(0,"0");break;
case 1:b.insert(0,"00");break;
default: break;
}//将二进制数转为八进制数位数必须是三的倍数,因此,要在长度不是三的倍数的字符串前面补0
for(int k=0;k<b.length();k=k+3)
{
string temp;
temp="";
int m=k;
temp.insert(0,b.substr(m,3));
for(int l=0;l<8;l++)
{
if(temp==y[l])
{
c+=(l+'0');
}
}
}//将二进制转换成八进制
int n=0;
string d;
while(c[n]=='0'){n++;}
d=c.substr(n);//去掉最前面的0
cout<<d<<endl;
}
}