16进制转8进制 的算法:先把16进制转为2进制,再将2进制转为8进制
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n;
string a,b,c;//分别表示16,2,8进制的数
cin>>n;
while(n--)
{
a="",b="",c="";
cin>>a;
for(int i=0;i<a.size();i++)
{
switch(a[i])
{
case '0':b+="0000";break;
case '1':b+="0001";break;
case '2':b+="0010";break;
case '3':b+="0011";break;
case '4':b+="0100";break;
case '5':b+="0101";break;
case '6':b+="0110";break;
case '7':b+="0111";break;
case '8':b+="1000";break;
case '9':b+="1001";break;
case 'A':b+="1010";break;
case 'B':b+="1011";break;
case 'C':b+="1100";break;
case 'D':b+="1101";break;
case 'E':b+="1110";break;
case 'F':b+="1111";break;
default:break;
}
}//将16进制的数a存储在2进制数b中
//二进制数转8进制数前先补0位
if((b.size()%3)==1)
b.insert(0,"00");
else if((b.size()%3)==2)
b.insert(0,"0");
int n_eight;//先暂存8进制的数
for(int i=0;i<b.size();i+=3)//2进制数b转8进制数c
{
n_eight=4*(b[i]-'0')+2*(b[i+1]-'0')+(b[i+2]-'0');
c+=(n_eight+'0');
}
//判断8进制数中第一位是否为0
for(int i=0;i<c.size();i++)
{
while(c[i]=='0')
i++;
cout<<c[i];
}
cout<<endl;
}
return 0;
}