【问题描述】
给定n个十六进制正整数,输出它们对应的八进制数。
【输入格式】
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
【输出格式】
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
【样例输入】
2
39
123ABC
【样例输出】
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
【思路】
先将十六进制转换成二进制,十六进制的每一位数转换成二进制有四位,之后转化成八进制,八进制中的每一位数转化成二进制有三位,转化过程中,不够三位的话,前面补 0 ;最后输出如果有前导 0,要去掉;
【AC代码】
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
map<string, string> s8;
string s16[16] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int main(){
int n;
cin >> n;
s8["000"] = "0"; s8["001"] = "1"; s8["010"] = "2"; s8["011"] = "3";
s8["100"] = "4"; s8["101"] = "5"; s8["110"] = "6"; s8["111"] = "7";
while(n--){
string s, a;
cin >> s;
for(int i = 0; i < s.length(); i++){
if(s[i] > '9'){
a += s16[s[i] - 'A' +10];
}
else{
a += s16[s[i] - '0'];
}
}
if(a.length()%3 == 1){
a = "00" + a;
}
else if(a.length()%3 == 2){
a = "0" + a;
}
int flag = 0;
for(int j = 0; j < a.length(); j+=3){
string temp = a.substr(j, 3);
string t = s8[temp];
if(j == 0 && t=="0"){
flag = 1;
continue;
}
if(flag==1 && j==3 && t=="0"){
continue;
}
cout << t;
}
cout << endl;
}
return 0;
}