给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
分析:
这个题考察的是进制转换,但是不是一般的进制转换,而是多位数,位数真的达到了100000,所以如果用一般的思路: 把十六进制转换成十进制,然后再由十进制转换成八进制是行不通的。
这里给出一种思路: 就是由十六进制转换成二进制,每四个一位,无非就是用字符串存放十六进制数,然后遍历一遍,得到二进制,
再由二进制转换成八进制,从后往前每三个数一位,就可以得到最终的结果。
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int num;
cin >> num;
for (int i=0; i<num; i++)
{
string str;
cin >> str;
int len = str.length();
string bin = "";
// 这里把输入的十六进制转换成二进制
for (int i=0; i<len; i++)
{
switch(str[i])
{
case '0':
bin += "0000";
break;
case '1':
bin += "0001";
break;
case '2':
bin += "0010";
break;
case '3':
bin += "0011";
break;
case '4':
bin += "0100";
break;
case '5':
bin += "0101";
break;
case '6':
bin += "0110";
break;
case '7':
bin += "0111";
break;
case '8':
bin += "1000";
break;
case '9':
bin += "1001";
break;
case 'A':
bin += "1010";
break;
case 'B':
bin += "1011";
break;
case 'C':
bin += "1100";
break;
case 'D':
bin += "1101";
break;
case 'E':
bin += "1110";
break;
case 'F':
bin += "1111";
break;
}
}
//这儿把二进制再转换成八进制
int blen = bin.length();
if (blen%3==1)
bin = "00" + bin;
else if (blen%3==2)
bin = "0" + bin;
bool flag = false;
for (int i=0; i<=bin.length()-3; i+=3)
{
int num = (bin[i]-'0')*4 + (bin[i+1]-'0')*2 + (bin[i+2]-'0');
if(num)
{
flag = true;
}
if(flag)
cout << num;
}
cout << endl;
}
return 0;
}