1. 程式人生 > >基礎練習-十六進位制轉八進位制

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

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

問題描述

        給定n個十六進位制正整數,輸出它們對應的八進位制數。

輸入格式

        輸入的第一行為一個正整數n (1<=n<=10)。
  接下來n行,每行一個由0~9、大寫字母A~F組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。


輸出格式

        輸出n行,每行為輸入對應的八進位制正整數。

  【注意
  輸入的十六進位制數不會有前導0,比如012A。
  輸出的八進位制數也不能有前導0。

樣例輸入

        2
  39
  123ABC

樣例輸出

        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]);
	}
}