蓝桥杯 基础练习 十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
c++代码:
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
int main()
{
int n,l,c,h;
string a,s;
char k[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int f[4]={0,0,0,0};
cin>>n;
for(int i=0;i<n;i++)
{
queue<int> q;
cin>>a;
int h=0;
for(int i=0;i<a.length();i++)
{
for(int j=0;j<16;j++)
{
if(a[i]==k[j])
{
int o=0;
int p;
c=3;
while(c>=0)
{
p=0;
l=pow(2,c);
if(j>=l)
{
j=j-l;
p=1;
}
o++;
h++;
q.push(p);
c--;
}
break;
}
}
}
int w;
int i=0;
int r[h];
while(!q.empty())
{
w=q.front();
q.pop();
r[i]=w;
i++;
}
int sum=0;
int ss=0;
int e=0;
queue<int> v;
for(int j=h-1;j>=0;j--)
{
if(r[j]==1)
{
sum+=pow(2,ss);
}
ss++;
if(ss==3)
{
ss=0;
e++;
v.push(sum);
sum=0;
}
if(j==0&&sum!=0)
{
v.push(sum);
}
}
int z;
int as[e];
int df=0;
while(!v.empty())
{
z=v.front();
v.pop();
as[df]=z;
df++;
}
for(int i=df-1;i>=0;i--)
{
if(as[i]==0)
{
continue;
}
if(as[i]!=0)
{
for(int j=i;j>=0;j--)
{
cout<<as[j];
}
cout<<endl;
break;
}
}
}
return 0;
}