问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
代码:
#include <iostream>
#include <string>
using namespace std;
int arr[10][4000000];//每个十六进制数长度不超过100000。
//输入的十六进制数不会有前导0,比如012A。
//输出的八进制数也不能有前导0。
int main03()
{
int n, count[10] = {0}; //1<=n<=10 count用于记录每次输入的16进制转化成的8进制数有几位
string str, str2; //str用于存储输入的16进制, str2用于存储转化后的2进制
cin >> n;
for(int j = 0; j < n; j++){
cin >> str;
for(int i = 0; i < str.length(); i++){
switch(str[i]){
case '0':str2+="0000";break;//注意引号和单引号
case '1':str2+="0001";break;
case '2':str2+="0010";break;
case '3':str2+="0011";break;
case '4':str2+="0100";break;
case '5':str2+="0101";break;
case '6':str2+="0110";break;
case '7':str2+="0111";break;
case '8':str2+="1000";break;
case '9':str2+="1001";break;
case 'A':str2+="1010";break;
case 'B':str2+="1011";break;
case 'C':str2+="1100";break;
case 'D':str2+="1101";break;
case 'E':str2+="1110";break;
case 'F':str2+="1111";break;
default:break;
}
}
//补零 因为转换成的2进制数时必须是3的倍数,后面才能进一步转换成8进制
if(str2.length() % 3 == 1) str2 = "00" + str2;
else if(str2.length() % 3 == 2) str2 = "0" + str2;
//2 转 8
for(int i = 0; i < str2.length(); i += 3){
arr[j][count[j]++] = (str2[i] - '0')*4 + (str2[i+1] - '0')*2 + (str2[i+2] - '0');
}
str2 = "";//每次str2用了要清零
}
for(int j = 0; j < n; j++){
for(int i = 0; i < count[j]; i++){
if(i == 0 && arr[j][i] == 0) continue;//考虑16进制输入0的情况 0000 --> 000 000
cout << arr[j][i];
}
cout << endl;
}
return 0;
}