题目链接:十六进制转二进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意:
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
解题思路
emmmm,其实也没啥难的,就是需要给它转换成二进制,然后再转换成八进制就好了,就是处理的时候麻烦点而已,不过需要注意,十六进制转二进制是一位转四位,二进制转八进制是三位转一位。
注意:每次数据使用完一定要把数组清空,用 memset 就可以,一般也不会超时。
代码篇
#include
#include
#include
#include
using namespace std;
string str;
char six[100001], bin[400005], eig[200000];
int i, k;
void change1(char ch) ///十六进制转二进制
{
int n = 4 * i + 1;
switch(ch)
{
case '0':{ bin[n] = '0',bin[n + 1] = '0',bin[n + 2] = '0',bin[n + 3] = '0'; break; }
case '1':{ bin[n] = '1',bin[n + 1] = '0',bin[n + 2] = '0',bin[n + 3] = '0'; break; }
case '2':{ bin[n] = '0',bin[n + 1] = '1',bin[n + 2] = '0',bin[n + 3] = '0'; break; }
case '3':{ bin[n] = '1',bin[n + 1] = '1',bin[n + 2] = '0',bin[n + 3] = '0'; break; }
case '4':{ bin[n] = '0',bin[n + 1] = '0',bin[n + 2] = '1',bin[n + 3] = '0'; break; }
case '5':{ bin[n] = '1',bin[n + 1] = '0',bin[n + 2] = '1',bin[n + 3] = '0'; break; }
case '6':{ bin[n] = '0',bin[n + 1] = '1',bin[n + 2] = '1',bin[n + 3] = '0'; break; }
case '7':{ bin[n] = '1',bin[n + 1] = '1',bin[n + 2] = '1',bin[n + 3] = '0'; break; }
case '8':{ bin[n] = '0',bin[n + 1] = '0',bin[n + 2] = '0',bin[n + 3] = '1'; break; }
case '9':{ bin[n] = '1',bin[n + 1] = '0',bin[n + 2] = '0',bin[n + 3] = '1'; break; }
case 'A':{ bin[n] = '0',bin[n + 1] = '1',bin[n + 2] = '0',bin[n + 3] = '1'; break; }
case 'B':{ bin[n] = '1',bin[n + 1] = '1',bin[n + 2] = '0',bin[n + 3] = '1'; break; }
case 'C':{ bin[n] = '0',bin[n + 1] = '0',bin[n + 2] = '1',bin[n + 3] = '1'; break; }
case 'D':{ bin[n] = '1',bin[n + 1] = '0',bin[n + 2] = '1',bin[n + 3] = '1'; break; }
case 'E':{ bin[n] = '0',bin[n + 1] = '1',bin[n + 2] = '1',bin[n + 3] = '1'; break; }
case 'F':{ bin[n] = '1',bin[n + 1] = '1',bin[n + 2] = '1',bin[n + 3] = '1'; break; }
default : break;
}
}
void change2() ///二进制转八进制
{
int n = i, res = 1, sum = 0;
for(int j = 0; j < 3; j++)
{
if(bin[n + j] >= '0' && bin[n + j] <= '9')
sum += res * ( bin[n + j] - '0');
res *= 2;
}
eig[k] = sum + '0';
}
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> str;
reverse(str.begin(), str.end());
memset(six, 0, sizeof(six));
memset(bin, 0, sizeof(bin));
memset(eig, 0, sizeof(eig));
for(i = 0; i < str.length(); i++)
six[i] = str[i];
int len = strlen(six);
for(i = 0; i < len; i++)
{
change1(six[i]);
}
len = len * 4;
for(i = 1, k = 0; i <= len; i += 3, k++)
{
change2();
}
int flag = 0;
for(i = strlen(eig) - 1; i >= 0; i--)
{
if(eig[i] >= '1' && eig[i] <= '9')
{
flag = 1;
for(i = i; i >= 0; i--)
cout << eig[i];
}
}
if(flag == 0) ///判断有无输出
cout << 0;
cout << endl;
}
return 0;
}