16进制转8进制

题目

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

转载于:https://www.cnblogs.com/WAoyu/p/8469281.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值