基礎練習-十六進制轉八進制

問題描述

        給定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]);
	}
}
相關文章
相關標籤/搜索