问题描述
给定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;
string a,b;
int c[10001000];
int main()
{
int n;
cin>>n;
while(n--)
{
a.clear();
b.clear();
cin>>a;
for(int i=0;i<a.size();i++)
{
switch(a[i])
{
case '0':b+="0000";break;
case '1':b+="0001";break;
case '2':b+="0010";break;
case '3':b+="0011";break;
case '4':b+="0100";break;
case '5':b+="0101";break;
case '6':b+="0110";break;
case '7':b+="0111";break;
case '8':b+="1000";break;
case '9':b+="1001";break;
case 'A':b+="1010";break;
case 'B':b+="1011";break;
case 'C':b+="1100";break;
case 'D':b+="1101";break;
case 'E':b+="1110";break;
case 'F':b+="1111";break;
}
}
// cout<<b<<endl;
if(a.size()%3==1) b="00"+b;
else if(a.size()%3==2) b="0"+b;
//cout<<b<<endl;
int ans=0;
for(int i=0;i<b.size();i+=3)
{
int j=(b[i]-'0')*4+(b[i+1]-'0')*2+(b[i+2]-'0');
c[ans++]=j;
}
for(int i=0;i<ans;i++)
{
if(i==0&&c[i]==0) continue;
cout<<c[i];
}
cout<<endl;
}
return 0;
}