问题描述
给定n个十六进制正整数,输出它们对应的八进制数。输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。样例输入
2
39
123ABC
样例输出
71
4435274
思路分析
每位16进制先转化为4位2进制,每3位2进制再转化为8进制。
#include<iostream>
#include<string>
using namespace std;
int main()
{
int num;
int i,j;
cin>>num;
string str_Hex[num];
string str_hex[num]="";
for(i=0;i<num;i++)
cin>>str_Hex[i];
//将16进制转化为2进制
for(i=0;i<num;i++)
for(j=0;j<str_Hex[i].size();j++)
{
switch(str_Hex[i][j])
{
case '0': str_hex[i]+="0000";break;
case '1': str_hex[i]+="0001"; break;
case '2': str_hex[i]+="0010";break;
case '3': str_hex[i]+="0011";break;
case '4': str_hex[i]+="0100";break;
case '5': str_hex[i]+="0101";break;
case '6': str_hex[i]+="0110";break;
case '7': str_hex[i]+="0111";break;
case '8': str_hex[i]+="1000";break;
case '9': str_hex[i]+="1001";break;
case 'A': str_hex[i]+="1010";break;
case 'B': str_hex[i]+="1011";break;
case 'C': str_hex[i]+="1100";break;
case 'D': str_hex[i]+="1101";break;
case 'E': str_hex[i]+="1110";break;
case 'F': str_hex[i]+="1111";break;
default: break;
}
}
//判断是否为3的整数倍,因为八进制为3个二进制
for(i=0;i<num;i++)
{
switch(str_hex[i].size()%3)
{
case 0: break;
case 1: str_hex[i]="00"+str_hex[i];break; //追加有方向,在左侧为左侧追加“00”
case 2: str_hex[i]="0"+str_hex[i];break;
default: break;
}
}
//将3个二进制化为一个八进制
// cout<<str_hex[0]<<endl;//测试转化为2进制输出
string out[num]="";
for(i=0;i<num;i++)
for(j=0;j<str_hex[i].size();j+=3)
{
//out[i]+=4*(str_hex[i][j+2]-'0')+2*(str_hex[i][j+1]-'0')+str_hex[i][j];
out[i]+=4*(str_hex[i][j]-'0')+2*(str_hex[i][j+1]-'0')+str_hex[i][j+2]; //字符串输出2再屏幕上,左侧是低位
}
//不输出前几位为0的
for(i=0;i<num;i++)
{
j=0;
while(out[i][j]=='0')
j++;
cout<<&out[i][j]<<endl; //用地址输出数组的一半
}
return 0;
}