十六進制轉十進制

基礎練習 十六進制轉八進制  
時間限制:1.0s   內存限制:512.0MB
      
問題描述
  給定n個十六進制正整數,輸出它們對應的八進制數。
輸入格式
  輸入的第一行爲一個正整數n (1=n=10)。
  接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。
輸出格式
  輸出n行,每行爲輸入對應的八進制正整數。
注意
  輸入的十六進制數不會有前導0,比如012A。
  輸出的八進制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
提示

  先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。

處理:

如, ABCD從後往前將每3位十六進制轉化爲十進制, 十進制是相對於十六進制的順尋逆序存儲的,再將十進制的數轉化成8進制, 每餘8就存到eight數組, 若不足4爲就自動補全, 最後再逆序輸出 

#include<stdio.h>
#include<string.h>
#define N 100005
char str[N];
int ten[N];
int eight[133000];
int main(){
	int n;
	int i, j, k;
	scanf("%d", &n);
	while(n--){
		int a, b, c, tmp, count;
		scanf("%s", str);
		int len = strlen(str);
	//	printf("%d\n", len);
		j = 0; 
		for(i = len - 1; i >= 0; i = i - 4){
			if( i - 2 >= 0){
				i = i - 2;
				count = 3;				
			}
			else if(i - 1 < 0)
				count = 1;
			else if(i - 1 >= 0){
				count = 2;
				i = i - 1;
			}
			c = 0; 
			while(count--){
				if(str[i] >= '0' && str[i] <= '9')
						tmp = str[i] - '0';
				if(str[i] >= 'A' && str[i] <= 'Z') 
						tmp = str[i] - 'A' + 10;
						c = c * 16 + tmp;
					//printf("%d\t%d\n", tmp, c);
						i++; 
			}
			//printf("----%d\n", c);	
			ten[j++] = c;				
		}
		k = 0;
		for(i = 0; i < j; i++){
			count = 4;
			while(ten[i] && count--){
				eight[k++] = ten[i] % 8;
				ten[i] = ten[i] / 8; 		
			}
			while(count--){
				eight[k++] = 0; 
			}			
		}
		for(i = k - 1; eight[i] == 0; i--);		
		for( ; i  >= 0; i--){
			printf("%d", eight[i]);
		}
		printf("\n", eight[i]);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章