问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
解:先转换成2进制数,再由2进制转换成8进制。(其实每3位16进制数都可以变成4位8进制数,这样转换也可以)
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <cmath> #include <queue> #include <deque> #include <cmath> #include <map> using namespace std; typedef long long ll; #define INF 0x7fffffff const double inf=1e20; const int maxn=100000+10; const int mod=1e9+7; const double pi=acos(-1); /* string transform_(int x,int y,string s){ string res=""; int sum=0; }*/ char a[maxn]; int b[maxn*4]; int c[maxn*2]; //b数组为2进制数 int s16[20][4]={ {0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1}, {0,1,0,0},{0,1,0,1},{0,1,1,0},{0,1,1,1}, {1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1}, {1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1}, }; int main(){ int t; scanf("%d",&t); while(t--){ memset(c,0,sizeof(c)); scanf("%s",a); int len=strlen(a); for(int i=0;i<len;i++){ if('A'<=a[i]&&a[i]<='Z')a[i]=a[i]-'A'+10; else a[i]=a[i]-'0'; for(int j=0;j<4;j++){ b[i*4+j]=s16[(int)a[i]][j]; } } //for(int i=0;i<4*len;i++)printf("%d",b[i]); //printf("\n"); int num=0; int i=0; if(len*4%3!=0){ i+=len*4%3; for(int j=0;j<i;j++){ c[0]*=2; c[0]+=b[j]; } if(c[0]!=0)num++; } for(;i<4*len;i+=3){ for(int j=i;j<i+3;j++){ c[num]*=2; c[num]+=b[j]; } num++; } if(c[0]!=0)printf("%d",c[0]); for(int i=1;i<num;i++){ printf("%d",c[i]); } printf("\n"); } return 0; }