基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1=n=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
时间限制: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;
}