题目
将16进制数,转化为8进制数,第一行n是16进制数的个数,接下来n行对应n个16进制数,输出n行对应8进制数
数据规模 :1<=n<=10,16进制数的个数<=100000
举例:
输入:
2
39
123ABC
输出:
71
4435274
思路
先将16进制数转化为2进制,再由2进制转为8进制。之所以转为2进制,是因为2进制和16、8进制之间的转化相对容易。所以总的来说,只要解决2进制和两个进制之间的转换问题就解决了。
代码
代码里有注释,很清楚了
#include <iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
map<string, string> A;
A["1"] = "0001";
A["2"] = "0010";
A["3"] = "0011";
A["4"] = "0100";
A["5"] = "0101";
A["6"] = "0110";
A["7"] = "0111";
A["8"] = "1000";
A["9"] = "1001";
A["A"] = "1010";
A["B"] = "1011";
A["C"] = "1100";
A["D"] = "1101";
A["E"] = "1110";
A["F"] = "1111";
A["0"] = "0000";
map <string, string> B;
B["001"] = "1";
B["010"] = "2";
B["011"] = "3";
B["100"] = "4";
B["101"] = "5";
B["110"] = "6";
B["111"] = "7";
B["000"] = "0";
//以上利用map结构来存储16进制和8进制每一位数对应的2进制数
int n;//16进制数个数
cin >> n;
string str[11];//存储16进制数的数组
for (int i = 0; i < n; i++)
{
cin >> str[i];
string bin = "";//16进制转化的2进制
for (int j = 0; j < str[i].length(); j++)
{
string key = "";
key += str[i][j];//将char类型转为string类型
bin += A[key];//将16进制的一位数转为2进制
}
//至此16进制转为了2进制
//先把左侧没有用的0删去
//但是可能这个2进制的位数不是3的倍数,所以要在左侧补0,补成3的倍数
//这样就可以和8进制数一一对应了
string temp = "";//补0的新2进制数
bool flag = false;//标志什么时候开始取数
for (int j = 0; j < bin.length(); j++)
{
if (bin[j]!=‘0‘)//当开头不为0的时候,开始取数
flag = true;
if (flag)
temp += bin[j];
}
//以上完成了去除头部的0
if (temp.length()%3 != 0)
{
int yu = temp.length() % 3;
if (yu==1)//如果模3为1,则要补2个0,以下同理
temp = "00" + temp;
if (yu == 2)
temp = "0" + temp;
}
//以上完成了补0
string k = "";//从左侧开始,每3位对应1个8进制数字
string oct = "";//答案
for (int j = 0; j < temp.length(); j++)
{
k += temp[j];
if ((j+1)%3==0)//当取到3位的时候
{
oct += B[k];//对应一个8进制数
k = "";//清空k
}
}
str[i] = oct;
}
for (int i = 0; i < n; i++)
cout << str[i] << endl;
return 0;
}