十六轉八進制
阿新 • • 發佈:2018-03-26
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進制
十六轉八進制