问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
代码:
#include<iostream>
#include<string>#include<algorithm>
#include<vector>
#include<cstring>
#include<string.h>
using namespace std;
void fun(string &m) //去掉开头的0
{
while(m[m.size()-1]=='0')
{
m.erase(m.size()-1);
}
}
int main()
{
int n;
cin>>n;
for(int k=0;k<n;k++)
{
string str,cstr="";
cin>>str;
for(int i=0;i<str.size();i++)
{
switch(str[i])
{
case '0':cstr+="0000";break;
case '1':cstr+="0001";break;
case '2':cstr+="0010";break;
case '3':cstr+="0011";break;
case '4':cstr+="0100";break;
case '5':cstr+="0101";break;
case '6':cstr+="0110";break;
case '7':cstr+="0111";break;
case '8':cstr+="1000";break;
case '9':cstr+="1001";break;
case 'A':cstr+="1010";break;
case 'B':cstr+="1011";break;
case 'C':cstr+="1100";break;
case 'D':cstr+="1101";break;
case 'E':cstr+="1110";break;
case 'F':cstr+="1111";break;
}
}
//cout<<cstr<<endl;
reverse(cstr.begin(),cstr.end());
int y=cstr.size()%3;
for(int i=0;i<3-y;i++)
{
cstr.append("0");
}
//cout<<cstr<<endl;
vector<string>st;
string ss="";
int col=3;
for(int i=0;i<cstr.size();i++)
{
ss.push_back(cstr[i]);
col--;
if(col<=0){
st.push_back(ss);
ss.clear();
col=3;
}
}
string str8="";
for(int i=0;i<st.size();i++)
{
//cout<<st[i]<<" ";
if(st[i]=="000"){ //不能用switch(),里面不能用字符串
str8+="0";
} else if(st[i]=="001"){
str8+="4";
} else if(st[i]=="010"){
str8+="2";
} else if(st[i]=="011"){
str8+="6";
} else if(st[i]=="100"){
str8+="1";
} else if(st[i]=="101"){
str8+="5";
} else if(st[i]=="110"){
str8+="3";
} else if(st[i]=="111"){
str8+="7";
}
}
//cout<<str8<<endl;
fun(str8);
reverse(str8.begin(),str8.end());
cout<<str8<<endl;
}
return 0;
}