1. 程式人生 > >十六轉八進制

十六轉八進制

scan include 字符 urn pos 答案 str 處理 stdio.h

這個題弄了我半天,最後終於算是出答案了,可是在提交的時候卻超時了,然後我放棄了,查了大佬的題解報告,粘在這裏,方便以後復習

 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進制

十六轉八進制