1 /*
2 基础练习 十六进制转八进制3
4 问题描述5 给定n个十六进制正整数,输出它们对应的八进制数。6 输入格式7 输入的第一行为一个正整数n (1<=n<=10)。8 接下来n行,每行一个由0~九、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每一个十六进制数长度不超过100000。9 输出格式10 输出n行,每行为输入对应的八进制正整数。11 注意12 输入的十六进制数不会有前导0,好比012A。13 输出的八进制数也不能有前导0。14 样例输入15 216 3917 123ABC18 样例输出19 7120 443527421 提示22 先将十六进制数转换成某进制数,再由某进制数转换成八进制。23 */
24 #include
25 #include
26 #include
27 #include
28 #include
29 #include
30 #include
31 using namespacestd;32 char str[100005], num;33 void Fun(int i, intstate)34 {35 inttemp;36 if(i < 0)37 {38 if(num != 0)39 {40 printf("%d", num);41 }42 return;43 }44 if(state != 3)45 {46 temp = str[i] >= '0' && str[i] <= '9' ? str[i] - '0' : str[i] - 'A' + 10;47 temp <<=state;48 num |=temp;49 temp =num;50 num >>= 3;51 Fun(i - 1, state + 1);52 printf("%d", (temp & 1) + (temp & 2) + (temp & 4));53 }54 else
55 {56 temp =num;57 num >>= 3;58 Fun(i, 0);59 printf("%d", (temp & 1) + (temp & 2) + (temp & 4));60 }61 }62 intmain()63 {64 intn;65 scanf("%d", &n);66 while(n--)67 {68 num = 0;69 scanf("%s", str);70 Fun(strlen(str) - 1, 0);71 printf("\n");72 }73 return 0;74 }75 /*
76 #include 77 #include 78 #include 79
80 #define MaxSize 10000081
82 void saveB(char *b,char c3,char c2,char c1,char c0,int start)83 {84 b[start]=c3;85 b[start+1]=c2;86 b[start+2]=c1;87 b[start+3]=c0;88 }89 int htob(char *h,char *b)90 {91 int i,j;92 int hl=strlen(h);93 for(i=0;i=0;i--)190 {191 if(i>0)192 o[i]=b[j]-48+(b[j-1]-48)*2+(b[j-2]-48)*4+48;193 else194 {195 switch(j)196 {197 case 2:198 o[i]=b[j]-48+(b[j-1]-48)*2+(b[j-2]-48)*4+48;199 break;200 case 1:201 o[i]=b[j]-48+(b[j-1]-48)*2+48;202 break;203 case 0:204 o[i]=b[j];205 break;206 }207
208 }209 j=j-3;210 }211 return ol;212 }213 void printO(char *o,int ol)214 {215 int i=0;216 if(o[0]=='0')217 i=1;218 for(;i
238 printO(o,ol);239 }240 }241
242 */