基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
39
123ABC
样例输出
71
4435274
4435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
<pre name="code" class="cpp">#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char s[100100]; int num[500010]; int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",s); int l=strlen(s); int j=0; for(int i=l-1;i>=0;i--) { if(s[i]=='A') { num[j++]=0,num[j++]=1; num[j++]=0,num[j++]=1; } else if(s[i]=='B') { num[j++]=1,num[j++]=1; num[j++]=0,num[j++]=1; } else if(s[i]=='C') { num[j++]=0,num[j++]=0; num[j++]=1,num[j++]=1; } else if(s[i]=='D') { num[j++]=1,num[j++]=0; num[j++]=1,num[j++]=1; } else if(s[i]=='E') { num[j++]=0,num[j++]=1; num[j++]=1,num[j++]=1; } else if(s[i]=='F') { num[j++]=1,num[j++]=1; num[j++]=1,num[j++]=1; } else { int g=j; int n=s[i]-'0'; while(n) { num[j++]=n%2; n=n/2; } j=g+4; } } int e,d,h=0; for(int i=0;i<j;i+=3) { d=1;int n=0; for(e=i;e<i+3;e++) { n+=num[e]*d; d*=2; } num[h++]=n; } int k; for(k=h-1;k>=0;k--) if(num[k]!=0) break; for(int i=k;i>=0;--i) printf("%d",num[i]); printf(" "); memset(num,0,sizeof(num)); memset(s,' ',sizeof(s)); } return 0; }