码迷,mamicode.com
首页 > 其他好文 > 详细

16进制转8进制

时间:2018-02-25 15:53:32      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:规模   stream   length   答案   return   post   数据   没有   name   

题目

将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;
}

16进制转8进制

标签:规模   stream   length   答案   return   post   数据   没有   name   

原文地址:https://www.cnblogs.com/WAoyu/p/8469281.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!