基礎練習-十六進位制轉八進位制
阿新 • • 發佈:2019-03-04
問題描述
給定n個十六進位制正整數,輸出它們對應的八進位制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進位制正整數。
【注意】
輸入的十六進位制數不會有前導0,比如012A。
輸出的八進位制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
解題思路:
- 需要先將十六進位制轉換成二進位制,然後再將二進位制轉換成八進位制,其中一位十六進位制可以轉換成四位二進位制,三位二進位制可以轉換為一位八進位制
- 要注意進位制轉換後0、1的排序問題
- 因為十六進位制的最大長度為100001,所以轉換後的八進位制考慮使用陣列接收
- 存在大數問題,一定要考慮記憶體空間的問題
程式碼實現:
#include <stdio.h>
#include<string.h>
#define MAXSIZE 100001
typedef struct {
char data[MAXSIZE];
} Node;
void convert(Node node);
int main (void) {
int time, i;
scanf("%d", &time);
Node number[time + 1];
for (i = 1; i <= time; i++) {
scanf("%s", &number[i].data);
}
for (i = 1; i <= time; i++) {
convert(number[i]);
printf("\n");
}
return 0;
}
void convert(Node node) {
int i = 0, middle = 0, value = 0, array[4 * strlen(node.data)], j = 0, counter = 0, mildderAr[4];
while (node.data[i] != '\0') {
value = (int) node.data[i];
/*輸入的值為A-F*/
if ( value > 64) {
middle = value - 55;
} else if (value > 47) { /*輸入的值為0-9*/
middle = value - 48;
}
/*將16進位制轉換為二進位制,如 8 ---> 0001*/
for (j = 0; j <= 3; j++) {
mildderAr[j] = middle % 2;
middle /= 2;
}
/*將上面得到的二進位制陣列逆置,即 8 ---> 1000,補充到array陣列中*/
while (j > 0) {
array[counter] = mildderAr[j - 1];
counter++;
j--;
}
i++;
}
int sum[i * 3], count = 0;
for (j = counter - 1; j >= 0; j -= 3) {
if (j > 1) {
sum[count] = array[j] + array[j - 1] * 2 + array[j - 2] * 4;
} else {
sum[count] = array[j] + array[j - 1] * 2;
}
count++;
}
for (i = count - 1; i >=0; i-- ) {
if (i == count - 1 && sum[i] == 0) {
continue;
}
printf("%d", sum[i]);
}
}