基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
思路
先将十六进制化为二进制,然后再将二进制化为八进制。
规律:
四位二进制对应一位十六进制。
三位二进制对应以为八进制。
另外,需要注意的是0001 转换出来的八进制前面有0,需要做特殊处理。
代码
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 100000;
//t数组接收输入
char t[maxn],a[maxn*4];
//二进制换为八进制
int binToOct(int s){
bool flag = true;
int i = 0;
//判断二进制长度是否为3的整数倍(前面是否需要加0)
if (s%3 == 0) {
i = 0;
} else {
if (s%3 == 1) {
a[i] = (a[i] - '0')*1 + '0';
i = 1;
}
if(s%3 == 2){
a[i] = (a[i] - '0')*2 + (a[i+1] - '0')*1 + '0';
i = 2;
}
}
int j = i;
for (; i < s; i += 3) {
a[i] = (a[i] - '0')*4 + (a[i+1] - '0')*2 + (a[i+2] - '0')*1 + '0';
}
if (j != 0) {
if (a[0] != '0')printf("%c",a[0]);
}
for (; j < s; j += 3){
if (a[j] == '0' && flag) {
continue;
} else {
printf("%c",a[j]);
flag = false;
}
}
printf("\n");
}
// 十六进制换为二进制
int hexToBin(){
int len = strlen(t);
int p,s = 0,k = 0;
for (int i = 0; i < len; i++) {
if (t[i] >= 'A' && t[i] <= 'F')p = t[i] - 'A' + 10;
else p = t[i] - '0';
s += 4;
while(p){
a[s-k-1] = p%2 + '0';
k++;
p /= 2;
}
//加0
while(k <= 3){
a[s-k-1] = '0';
k++;
}
k = 0;
}
return s;
}
int main() {
int n;
scanf("%d", &n);
while(n--){
scanf("%s",&t);
int len = hexToBin();
binToOct(len);
memset(a, 0, sizeof(a));
}
return 0;
}