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