试题 基础练习 十六进制转八进制
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式
输出n行,每行为输入对应的八进制正整数。【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。样例输入
2
39
123ABC样例输出
71
4435274***【*提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
const int maxn = 100010;
string hs,bs,os;//存十六进制、二进制、八进制
map<char,string> table;//16到2的映射
map<string,char> table2;//2到8的映射
//初始化映射关系
void init() {
table['0'] = "0000";
table['1'] = "0001";
table['2'] = "0010";
table['3'] = "0011";
table['4'] = "0100";
table['5'] = "0101";
table['6'] = "0110";
table['7'] = "0111";
table['8'] = "1000";
table['9'] = "1001";
table['A'] = "1010";
table['B'] = "1011";
table['C'] = "1100";
table['D'] = "1101";
table['E'] = "1110";
table['F'] = "1111";
table2["000"] = '0';
table2["001"] = '1';
table2["010"] = '2';
table2["011"] = '3';
table2["100"] = '4';
table2["101"] = '5';
table2["110"] = '6';
table2["111"] = '7';
}
//删除开头多余的0
void deleteZero(string& str) {
while(str[0] == '0') {
str.erase(0,1);
}
}
void BinToOct() {
//当二进制串不是3的倍数,给它补足
while (bs.size() % 3 != 0) {
bs = "0" + bs;
}
//初始化os
os = "";
//每3个二进制位对应一个八进制串
for (int i = 0; i < bs.size(); i+=3) {
string str = bs.substr(i, 3);
os += table2[str];
}
//删除开头多余的0
deleteZero(os);
}
void HexToBin() {
//初始化bs
bs = "";
//遍历十六进制串,每个十六进制字符转换成二进制串
for (int i = 0; i < hs.size(); i++) {
bs += table[hs[i]];
}
//删除开头多余的0
deleteZero(bs);
}
int main() {
init();
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> hs;
HexToBin();
BinToOct();
cout << os << endl;
}
return 0;
}