#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int main() {
//freopen("E:\\in.txt","r",stdin);
while(cin >> n) {
while(n--){
cin >> s; //例子:s = 39
int l = s.length();
string s2;
for(int i = 0;i < l;++i){ //将16进制转化为二进制(1位16进制对应4位二进制) 例子:s2 = 00111001
switch(s[i])
{
case '0': s2 += "0000"; break; ///**在字符串s的后面添加元素,通过s+="..."实现
case '1': s2 += "0001"; break;
case '2': s2 += "0010"; break;
case '3': s2 += "0011"; break;
case '4': s2 += "0100"; break;
case '5': s2 += "0101"; break;
case '6': s2 += "0110"; break;
case '7': s2 += "0111"; break;
case '8': s2 += "1000"; break;
case '9': s2 += "1001"; break;
case 'A': s2 += "1010"; break;
case 'B': s2 += "1011"; break;
case 'C': s2 += "1100"; break;
case 'D': s2 += "1101"; break;
case 'E': s2 += "1110"; break;
case 'F': s2 += "1111"; break;
default: break;
}
}
int len = s2.length();
if(len%3 == 1) //将s2的长度凑成3的倍数 例子:s2 = 000111001
s2 = "00" + s2; ///**在字符串s的前面添加元素,通过s="..."+s实现
else if(len%3 == 2)
s2 = '0' + s2;
for(int j = 0;j < len;j += 3){ //将二进制转化为八进制(3位对应1位八进制) 例子:temp=0、7、1
int temp = 4*(s2[j]-'0') + 2*(s2[j+1]-'0') + (s2[j+2]-'0');
if(temp||j) cout << temp; //忽略前导零 但是不能忽略中间的零(括号中的j) 例子:忽略s2中的前面的三个0,即此时temp = 0
}
cout << endl;
}
}
return 0;
}
要点:①16进制->二进制->八进制
1位16进制对应4位二进制 3位二进制对应1位八进制
②在字符串的前面添加元素和在字符串的后面添加元素的实现方法
在字符串s的后面添加元素,通过s+="..."实现 在字符串s的前面添加元素,通过s="..."+s实现 ③忽略前导零时,注意不能忽略中间的零
忽略前导零 但是不能忽略中间的零(括号中的j)
if(temp||j)
十六进制到八进制转换器

被折叠的 条评论
为什么被折叠?



