基础练习-十六进制转八进制

问题描述

        给定n个十六进制正整数,输出它们对应的八进制数。node

输入格式

        输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~九、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每一个十六进制数长度不超过100000。数组


输出格式

        输出n行,每行为输入对应的八进制正整数。

  【注意
  输入的十六进制数不会有前导0,好比012A。
  输出的八进制数也不能有前导0。spa

样例输入

        2
  39
  123ABCcode

样例输出

        71
  4435274 排序

解题思路:

  1.  须要先将十六进制转换成二进制,而后再将二进制转换成八进制,其中一位十六进制能够转换成四位二进制,三位二进制能够转换为一位八进制
  2. 要注意进制转换后0、1的排序问题
  3. 由于十六进制的最大长度为100001,因此转换后的八进制考虑使用数组接收
  4. 存在大数问题,必定要考虑内存空间的问题

代码实现:

#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]);
	}
}
相关文章
相关标签/搜索