蓝桥杯十六进制转八进制(大数)
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
常用的string方法:
1.string a ; a.insert(0,t,‘0’)//在索引0前面插入t个‘0’
2.string bb(a,j,3) 新建一个bb,把a的j开始3个字符复制给a.
#include<bits/stdc++.h>
using namespace std;
string a,b,c;
map<char,string> M;
map<string,char> m;
int main()
{
M['0']="0000";M['1']="0001";M['2']="0010";M['3']="0011";
M['4']="0100";M['5']="0101";M['6']="0110";M['7']="0111";
M['8']="1000";M['9']="1001";M['A']="1010";M['B']="1011";
M['C']="1100";M['D']="1101";M['E']="1110";M['F']="1111";
m["000"]='0';m["001"]='1';m["010"]='2';m["011"]='3';m["100"]='4';
m["101"]='5';m["110"]='6';m["111"]='7';
int temp,n,i,j;
char cc[10];
string ans;
cin>>n;
for(i=0;i<n;i++)
{
cin>>c;
for(j=0;j<c.length();j++)
a+=M[c[j]];
//cout<<a<<endl;
int t=3-a.length()%3;
a.insert(0,t,'0');
for(j=0;j<a.length();j+=3)
{
string bb(a,j,3);
ans+=m[bb];
}
int flag = 0;
for(j=0;j<ans.length();j++)
{
if(flag==1)
{
cout<<ans[j];
}
else if(ans[j]!='0')
{
cout<<ans[j];
flag=1;
}
}cout<<endl;
ans="";
a="";
}
}