问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
/*十六进制转二进制,二进制转八进制
##############遇到的坑############################
1.要转换为二进制来做!100000位的十六进制!太大了!
2.字符串后添加字符 可以 s = s +'a' 不可以 s += 'a'
3.string.append(string) 传入参数不能是char,只能是string
4.动态定义数组
string *ss = new string[n];
delete[] ss;
*/
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
string string_to8(string s)//s为待转3/2/1位二进制字符串
{
if(s == "00" || s == "0")
return "";
if(s =="000")
return "0";
if(s == "1" || s == "01" || s == "001")
return "1";
if(s == "10" || s == "010")
return "2";
if(s == "11" || s == "011")
return "3";
if(s == "100")
return "4";
if(s == "101")
return "5";
if(s == "110")
return "6";
if(s == "111")
return "7";
}
string char_to2(char a)//将十六进制字符转换成二进制数字
{
switch(a)
{
case '0':return "0000";
case '1':return "0001";
case '2':return "0010";
case '3':return "0011";
case '4':return "0100";
case '5':return "0101";
case '6':return "0110";
case '7':return "0111";
case '8':return "1000";
case '9':return "1001";
case 'A':return "1010";
case 'B':return "1011";
case 'C':return "1100";
case 'D':return "1101";
case 'E':return "1110";
case 'F':return "1111";
}
}
int main()
{
int n;
string s,binary,temp,res;
cin>>n;
while(n != 0)
{
int bit = 0;
temp = res = binary = "";
cin>>s;
//cout<<s.length()<<"changdu"<<endl;
for(int i=0;i<s.length();i++)
binary += char_to2(s[i]);
//cout<<binary<<endl;
for(int j=binary.length()-1;j>-1;j--)
{
temp = temp + binary[j];
bit++;
if(bit % 3 == 0)
{
reverse(temp.begin(),temp.end());
//cout<<"temp = "<<temp<<endl;
res.append(string_to8(temp));
//cout<<res<<endl;
bit = 0;
temp = "";
}
else if(bit % 3 != 0 && j == 0)
{
reverse(temp.begin(),temp.end());
//cout<<"temp = "<<temp<<endl;
res.append(string_to8(temp));
//cout<<res<<endl;
bit = 0;
temp = "";
}
else
continue;
}
reverse(res.begin(),res.end());
for(int k = 0;k<res.length();k++)
{
if(k == 0 && res[k] == '0')
continue;
else
cout<<res[k];
}
cout<<endl;
n--;
}
return 0;
}