十六进制转十进制

基础练习 十六进制转八进制  
时间限制: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值