十六转八进制

这个题弄了我半天,最后终于算是出答案了,可是在提交的时候却超时了,然后我放弃了,查了大佬的题解报告,粘在这里,方便以后复习

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 char h[100002], b[400002], e[400002];
 5 int main() {
 6     int n;
 7     scanf("%d", &n);
 8     while (n--) {
 9         scanf("%s", h);
10         int i, len = 0;
11         /*先把16进制化成二进制——从后往前展开 */
12         for (i = strlen(h) - 1; i >= 0; i--) {
13             int v;
14             if (h[i] >= '0' && h[i] <= '9')
15                 v = h[i] - '0';
16             else v = h[i] - 'A' + 10;
17             for (int j = 0; j<4; j++) {
18                 b[len++] = v % 2 + '0';
19                 v /= 2;
20             }
21         }
22         int x = 0, cnt = 1;
23         int l = 0;
24         for (i = 0; i<len; i++) {
25             /*每三位二进制转成一位8进制,最后不足三位补0*/
26             if (cnt == 4 || i == len - 1) {
27                 x = cnt * (b[i] - '0') + x;
28                 cnt = 1;
29                 e[l++] = x + '0';
30                 x = 0;
31             }
32             else {
33                 x = cnt * (b[i] - '0') + x;
34                 cnt *= 2;
35             }
36         }
37         i = l - 1;
38         while (i >= 0 && e[i] == '0')
39             /*去掉前导0*/
40             i--;
41         if (i<0)
42             printf("0");
43         for (; i >= 0; i--) {
44             printf("%c", e[i]);
45         }
46         printf("
");
47     }
48     return 0;
49 }

个人觉得很不错的部分有很多,比如处理字符转为2进制,再在循环的基础上用判断的语句巧妙转为8进制

原文地址:https://www.cnblogs.com/kangdong/p/8654088.html