码迷,mamicode.com
首页 > 其他好文 > 详细

十六转八进制

时间:2018-03-26 22:34:12      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:基础上   二进制   去掉   turn   16进制   从后往前   stdio.h   har   展开   

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

 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("\n");
47     }
48     return 0;
49 }

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

 

十六转八进制

标签:基础上   二进制   去掉   turn   16进制   从后往前   stdio.h   har   展开   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!