/*十六进制转八进制
问题描述 给定n个十六进制正整数,输出它们对应的八进制数。
输入格式 输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式 输出n行,每行为输入对应的八进制正整数。
【注意】 输入的十六进制数不会有前导0,比如012A。 输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】 先将十六进制数转换成某进制数,再由某进制数转换成八进制。*/
#include<stdio.h>
#include<string.h>
char h[100002],b[400002],e[400002];
int main()
{int n;scanf("%d",&n);
while(n--){
scanf("%s",h);
int i,len=0;/*先把16进制化成二进制——从后往前展开 */
for(i=strlen(h)-1;i>=0;i--){
int v;
if(h[i]>='0' && h[i]<='9')
v=h[i]-'0';
else
v=h[i]-'A'+10;
for(int j=0;j<4;j++){
b[len++]=v%2+'0';
v/=2;
}
}
b[len]='\0';
int x=0,cnt=1;
int l=0;
for(i=0;i<len;i++){ /*每三位二进制转成一位8进制,最后不足三位补0*/
if(cnt==4||i==len-1){
x=cnt*(b[i]-'0')+x;
cnt=1;
e[l++]=x+'0';
x=0;
}
else{
x=cnt*(b[i]-'0')+x;
cnt*=2;
}
}
i=l-1;
while(i>=0 && e[i]=='0') /*去掉前导0*/
i--;
if(i<0)
printf("0");
for (;i>=0;i--){ printf("%c",e[i]); }
printf("\n");
}
return 0;
}
方法二、
#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[k*3+1]-'0')*2+(tow[k*3+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;
}