问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
这个十六进制的字符串太长了,转化为十进制不现实,可以考虑转化为二进制,然后在转化为八进制。另外,一个十六进制转化为二进制对应四个二进制,一个八进制对应三个二进制
ac代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int cycle;cin>>cycle;
while(cycle--){
string s,binary="";
cin>>s;
for(int i=0;i<s.size();i++){
switch(s[i]){
case '0':binary+="0000";break;
case '1':binary+="0001";break;
case '2':binary+="0010";break;
case '3':binary+="0011";break;
case '4':binary+="0100";break;
case '5':binary+="0101";break;
case '6':binary+="0110";break;
case '7':binary+="0111";break;
case '8':binary+="1000";break;
case '9':binary+="1001";break;
case 'A':binary+="1010";break;
case 'B':binary+="1011";break;
case 'C':binary+="1100";break;
case 'D':binary+="1101";break;
case 'E':binary+="1110";break;
case 'F':binary+="1111";break;
}
}
if(binary.size()%3==1)binary="00"+binary;
else if(binary.size()%3==2) binary="0"+binary;
if(binary.substr(0,3)=="000") binary=binary.substr(3);//去除最前的三个0可以不会有前导零
string ans="";
for(int i=0;i<binary.size()-2;i+=3){
ans+=(4*(binary[i]-'0')+2*(binary[i+1]-'0')+binary[i+2]-'0')+'0';
}
cout<<ans<<endl;
}
return 0;
}