问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
代码:
注意,这个数字可能很大,长度最大为100000。
把每一个16进制位对应4个2进制位保存位二进制数到数组s3,从s3尾部开始,每三个二进制位对应一个8进制位保存到s3,最后过滤前导0输出。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 1e5+5;
class Buffer
{
public:
char s1[maxn]; //保存16进制数
char s3[maxn*4];//将16进制转化为2进制保存
char s2[maxn*4/3+1];//保存8进制数
int p1, p2, p3;//对应字符数组的指针
Buffer()
{
cin >> s1;
p1 = strlen(s1);
p3 = 0;
for(int i = 0; i < p1; i++){
func(s1[i]);//转化为二进制写入s3;
}
//将2进制转化为8进制
p2 = 0;
int r = p3%3;//这里是为了对齐
int buf = 0;
for(int i = 0; i < r; i++){
buf <<= 1;
buf = buf | (s3[i]-'0');
}
if(r != 0)s2[p2++] = (char)(buf + '0');
//对剩余的二进制位每3位对应一个八进制数写入s2;
for(int i = r; i < p3; i += 3){
buf = 0;
for(int j = i; j < i+3; j++){
buf <<= 1;
buf = buf | (s3[j] - '0');
}
s2[p2++] = (char)(buf + '0');
}
}
void out()//输出
{
int i = 0;
while(s2[i] == '0')i++;//过滤前导‘0’;
for(; i < p2; i++){
printf("%c", s2[i]);
}
printf("\n");
}
void func(char ch)
{
switch(ch){
case '0':{
s3[p3++] = '0';
s3[p3++] = '0';
s3[p3++] = '0';
s3[p3++] = '0';
break;
}
case '1':{
s3[p3++] = '0';
s3[p3++] = '0';
s3[p3++] = '0';
s3[p3++] = '1';
break;
}
case '2':{
s3[p3++] = '0';
s3[p3++] = '0';
s3[p3++] = '1';
s3[p3++] = '0';
break;
}
case '3':{
s3[p3++] = '0';
s3[p3++] = '0';
s3[p3++] = '1';
s3[p3++] = '1';
break;
}
case '4':{
s3[p3++] = '0';
s3[p3++] = '1';
s3[p3++] = '0';
s3[p3++] = '0';
break;
}
case '5':{
s3[p3++] = '0';
s3[p3++] = '1';
s3[p3++] = '0';
s3[p3++] = '1';
break;
}
case '6':{
s3[p3++] = '0';
s3[p3++] = '1';
s3[p3++] = '1';
s3[p3++] = '0';
break;
}
case '7':{
s3[p3++] = '0';
s3[p3++] = '1';
s3[p3++] = '1';
s3[p3++] = '1';
break;
}
case '8':{
s3[p3++] = '1';
s3[p3++] = '0';
s3[p3++] = '0';
s3[p3++] = '0';
break;
}
case '9':{
s3[p3++] = '1';
s3[p3++] = '0';
s3[p3++] = '0';
s3[p3++] = '1';
break;
}
case 'A':{
s3[p3++] = '1';
s3[p3++] = '0';
s3[p3++] = '1';
s3[p3++] = '0';
break;
}
case 'B':{
s3[p3++] = '1';
s3[p3++] = '0';
s3[p3++] = '1';
s3[p3++] = '1';
break;
}
case 'C':{
s3[p3++] = '1';
s3[p3++] = '1';
s3[p3++] = '0';
s3[p3++] = '0';
break;
}
case 'D':{//13
s3[p3++] = '1';
s3[p3++] = '1';
s3[p3++] = '0';
s3[p3++] = '1';
break;
}
case 'E':{//14
s3[p3++] = '1';
s3[p3++] = '1';
s3[p3++] = '1';
s3[p3++] = '0';
break;
}
case 'F':{
s3[p3++] = '1';
s3[p3++] = '1';
s3[p3++] = '1';
s3[p3++] = '1';
break;
}
}
}
};
int main()
{
//freopen("in.txt", "r", stdin);
int t;
cin >> t;
while(t--){
Buffer buffer;
buffer.out();
}
return 0;
}