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

时间: 2024-10-27 18:37:39

16进制转8进制的相关文章

java 16进制转换10进制

public static String toHexString2(byte[] b) { StringBuffer buffer = new StringBuffer(); for (int i = 0; i < b.length; ++i) { buffer.append(toHexString2(b[i])); } return buffer.toString(); } public static String toHexString2(byte b) { char[] buffer =

QT 16进制 ASII &nbsp; 10进制 转换

 //16进制字符串转字节数组     static QByteArray HexStrToByteArray(QString str)     {         QByteArray senddata;  //发送数据         int hexdata,lowhexdata;         int hexdatalen = 0;         int len = str.length();  //求出发送字符传唱度         senddata.resize(len/2); /

Java 10进制转2、8、16进制转换 / 2、8、16进制转10进制转换

public static void main(String[] args) { int i = 10; System.out.println("***********10进制转换2进制.8进制.16进制************"); System.out.println(Integer.toBinaryString(i)); // 10转换2进制 System.out.println(Integer.toOctalString(i)); // 10转换8进制 System.out.p

16进制与10进制

16进制 0 1 2 3 4 5 6 7 8 9 a b c d e f. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 0 1 2(16进制中的10 进制表象,进位后,前边一位)10进制 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20我们的计算机中一般都以16进制保存.我们用的时间就是这种60进制中的10进制表象.

PHP进制转换[实现2、8、16、36、64进制至10进制相互转换]

自己写了一个PHP进制转换程序,一个类吧,第一次写这个东东,写这个东东,在处理文本文件时能用得到. 可以实现: 10进制转换2.8.16.36.62进制2.8.16.36.62进制转换10进制 有点要注意下,2.8.16进制转换时,使用的是系统的自己的函数. 所以,不管怎么高精度转换值可能大于2147483646. 另外, 32进制低精转换,最大值:2147483646: 32进制高精转换,最大值:77309411327: 64进制高精转换,最大值:133143986175. jinzhi.ph

十进制转换成十六进制、16进制转2进制

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() { int i,v; char bs[33]; char b[33]; char hs[9]; char h[9]; char s[4]; char *e; // 十进制整数转二进制串: i=1024; ltoa(i,b,2); sprintf(bs,"%032s&quo

10进制转16进制,16进制转10进制,随机出一个6位十六进制颜色值

方案一: var num16 = "ffffff";var num10 = parseInt(num16,16);//16进制转10进制console.log(num10) // 16777215 var colorNum = Math.round(Math.random()*num10).toString(16);colorNum = ("000000"+colorNum).slice(-6)console.log("#"+colorNum)

Delphi XE2 16进制转10进制《LceMeaning》

以下在编写IC卡项目时出现卡号转换错误时的解决方法,在XE2下测试正常.================================================ uses math; function HexToDec(Hex : string) : string; var i : integer; res : real; len : integer; begin len := length(Trim(Hex)); for i := 1 to len do begin case Hex[

蓝桥杯 16进制转换8进制

蓝桥杯 16进制转换8进制 我表示我自己太渣渣了,总是超时,通不过测试. 题目 问题描述 给定n个十六进制正整数,输出它们对应的八进制数.输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由0~9.大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000.输出格式 输出n行,每行为输入对应的八进制正整数.注意 输入的十六进制数不会有前导0,比如012A. 输出的八进制数也不能有前导0.样例输入239123ABC样例输出7144

16进制转10进制和2进制

/** * 16进制转10进制 * * @param str * @return */ public static String sixteenToTen(String str) { int ten = Integer.parseInt(str, 16); String result = String.valueOf(ten); return result; } /** * 16进制转2进制 * @param str * @return */ public static String hexSt