给定n个十六进制正整数,输出它们对应的八进制数。node
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~九、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每一个十六进制数长度不超过100000。数组
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,好比012A。
输出的八进制数也不能有前导0。spa
2
39
123ABCcode
71
4435274 排序
#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]); } }