问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
解题思路:
需要先将十六进制转换成二进制,然后再将二进制转换成八进制,其中一位十六进制可以转换成四位二进制,三位二进制可以转换为一位八进制
要注意进制转换后0、1的排序问题
因为十六进制的最大长度为100001,所以转换后的八进制考虑使用数组接收
存在大数问题,一定要考虑内存空间的问题
代码实现:
#include
#include
#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]);
}
}