问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出n行,每行为输入对应的八进制正整数。
注意输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
2
39
123ABC
71
4435274
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
思路
先将16进制数转换成2进制数,再转换成8进制数。
代码:
#include<stdio.h> #include<string.h> char h[100002],b[400002],e[400002]; int main(){ int n; scanf("%d",&n); while(n--){ scanf("%s",h); int i,len=0; /*先把16进制化成二进制——从后往前展开 */ for(i=strlen(h)-1;i>=0;i--){ int v; if(h[i]>='0' && h[i]<='9') v=h[i]-'0'; else v=h[i]-'A'+10; for(int j=0;j<4;j++){ b[len++]=v%2+'0'; v/=2; } } b[len]=' '; int x=0,cnt=1; int l=0; for(i=0;i<len;i++){ /*每三位二进制转成一位8进制,最后不足三位补0*/ if(cnt==4||i==len-1){ x=cnt*(b[i]-'0')+x; cnt=1; e[l++]=x+'0'; x=0; } else{ x=cnt*(b[i]-'0')+x; cnt*=2; } } i=l-1; while(i>=0 && e[i]=='0') /*去掉前导0*/ i--; if(i<0) printf("0"); for (;i>=0;i--){ printf("%c",e[i]); } printf("n"); } return 0; } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849