问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string HexToBin(string Hex)
{
string Bin;
for (int i = 0; i < Hex.length(); i++)
{
switch (Hex[i])
{
case '0': Bin.append("0000"); break;
case '1': Bin.append("0001"); break;
case '2': Bin.append("0010"); break;
case '3': Bin.append("0011"); break;
case '4': Bin.append("0100"); break;
case '5': Bin.append("0101"); break;
case '6': Bin.append("0110"); break;
case '7': Bin.append("0111"); break;
case '8': Bin.append("1000"); break;
case '9': Bin.append("1001"); break;
case 'A': Bin.append("1010"); break;
case 'B': Bin.append("1011"); break;
case 'C': Bin.append("1100"); break;
case 'D': Bin.append("1101"); break;
case 'E': Bin.append("1110"); break;
case 'F': Bin.append("1111"); break;
}
}
return Bin;
}
vector<int> BinToOct(string Bin)
{
int flag = Bin.length() % 3;
if (flag == 1)
Bin.insert(0, "00");
else if (flag == 2)
Bin.insert(0, "0");
vector<int>Oct;
int cnt = 0;
while (cnt != Bin.length())
{
int result;
result = 4 * (Bin[cnt++] - '0') + 2 * (Bin[cnt++] - '0') + (Bin[cnt++] - '0');
Oct.push_back(result);
}
return Oct;
}
int main()
{
int cnt;
cin >> cnt;
string *Hex = new string[cnt];
for (int i = 0; i < cnt; i++)
{
cin >> Hex[i];
}
for (int i = 0; i < cnt; i++)
{
vector<int>::iterator it;
vector<int> result = BinToOct(HexToBin(Hex[i]));
for (it = result.begin(); it != result.end(); it++)
{
if (it == result.begin() && *it == 0)
continue;
cout << *it;
}
if (i != cnt - 1)
cout << endl;
}
return 0;
}
16进制转2进制用枚举法;
2进制转8进制,采用每3位二进制数字转化为1个8进制数