问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意 】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意 】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
#include<bits/stdc++.h>
using namespace std;
#define maxn 100000*10
int aa[1000];
int a[maxn];
int b[maxn];
char s[maxn];
int l;
void xxx(int x){
for(int j=0;j<4;j++){
a[l++]=x%2;
//cout<<a[l-1]<<endl;
x=x/2;
}
}
int main(){
int n;
cin>>n;
while(n--){
s[0]='\0';
memset(b,0,sizeof(b));
memset(a,0,sizeof(a));
cin>>s;
l=0;
int len=strlen(s);
for(int j=len-1;j>=0;j--){
int z;
if(s[j]>='0'&&s[j]<='9'){
z=s[j]-'0';
}
else{
z=s[j]-'A'+10;
}
xxx(z);
}
int cnt=1,x=0,k=0;
for(int i=0;i<l;i++)
{
if(cnt==4||i==l-1)
{
x+=cnt*a[i];
cnt=1;
b[k++]=x;
x=0;
}
else
{
x+=cnt*(a[i]);
cnt*=2;
}
}
while(b[k]==0&&k>=0){
k--;
}
if(k<0) printf("0");
else{
for(int j=k;j>=0;j--){
cout<<b[j];
}
}
cout<<endl;
}
}