问题描述 给定n个十六进制正整数,输出它们对应的八进制数。
输入格式 输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式 输出n行,每行为输入对应的八进制正整数。
【注意】 输入的十六进制数不会有前导0,比如012A。 输出的八进制数也不能有前导0。
样例输入 2 39 123ABC
样例输出 71 4435274
【提示】 先将十六进制数转换成某进制数,再由某进制数转换成八进制。 #include <iostream> using namespace std; int main() { int n=0; //记录输入数据的个数 cin>>n;
string sixTeen[10]; //用来记录输入的数据
for(int i=0;i<n;i++) { cin>>sixTeen[i]; }
for(int i=0;i<n;i++) { string eight;//记录八进制数据 string tow; //记录二进制数据 char eig;
//转换为二进制 for(int j=0;j<sixTeen[i].length();j++) { switch(sixTeen[i][j]) { case '0':tow+="0000";break; case '1':tow+="0001";break; case '2':tow+="0010";break; case '3':tow+="0011";break; case '4':tow+="0100";break; case '5':tow+="0101";break; case '6':tow+="0110";break; case '7':tow+="0111";break; case '8':tow+="1000";break; case '9':tow+="1001";break; case 'A':tow+="1010";break; case 'B':tow+="1011";break; case 'C':tow+="1100";break; case 'D':tow+="1101";break; case 'E':tow+="1110";break; case 'F':tow+="1111";break; default:break; }
}
//转换为八进制 //首先补齐“0” int m=tow.length()%3; if(m==1) tow.insert(0,"00"); else if(m==2) tow.insert(0,"0"); //进行转换 if(!(tow[0]=='0'&&tow[1]=='0'&&tow[2]=='0')) { eig=(tow[0]-'0')*4+(tow[1]-'0')*2+(tow[2]); eight=eight+eig; }
for(int k=3;k<tow.length();k=k+3) { //eig=(tow[k*3]-'0')4+(tow[k3+1]-'0')2+(tow[k3+2]); //eight=eight+eig;
if(tow.substr(k,3)=="000") eight+="0"; else if(tow.substr(k,3)=="001") eight+="1"; else if(tow.substr(k,3)=="010") eight+="2"; else if(tow.substr(k,3)=="011") eight+="3"; else if(tow.substr(k,3)=="100") eight+="4"; else if(tow.substr(k,3)=="101") eight+="5"; else if(tow.substr(k,3)=="110") eight+="6"; else if(tow.substr(k,3)=="111") eight+="7";
}
//输出最终的八进制数 cout<<eight<<endl; }
return 0; }