zoukankan      html  css  js  c++  java
  • 蓝桥---十六进制转八进制(进制关系)

    Description

    给定n个十六进制正整数,输出它们对应的八进制数。

    Input

    输入的第一行为一个正整数n (1<=n<=10)。
    接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

    Output

    输出n行,每行为输入对应的八进制正整数。

    Sample Input

    2
    39
    123ABC

    Sample Output

    71
    4435274

    注意

    输入的十六进制数不会有前导0,比如012A。

    输出的八进制数也不能有前导0。

    提示

    先将十六进制数转换成某进制数,再由某进制数转换成八进制。

    解题思路:

    首先先讲一些相关知识点

    二进制转十六进制

    二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。

    从右到左 4位一切,例如 100111110110101,左边不满4位的可以用0补满 0100,1111,1011,0101,所以前面的二进制转为十六进制为 4FB5。

    同理二进制转八进制,是以3位一段,分别转换成八进制。

    十六进制转换成二进制

    反过来,当看到 FD时,迅速将它转换为二进制数方法

    先转换F:

    看到F,需知道它是15,然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。

    接着转换 D:

    看到D,知道它是13,13如何用8421凑呢?应该是:8 + 4 + 1,即:1101。

    所以,FD转换为二进制数,为: 11111101

    由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成二进制数时,也可以先转换成十六进制,然后再转换成二进制。

    再来说本题,十六进制转换成八进制,可先把十六进制转换成二进制,再把二进制转换成八进制。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <string>
     5 #include <math.h>
     6 #include <algorithm>
     7 #include <vector>
     8 #include <stack>
     9 #include <queue>
    10 #include <set>
    11 #include <map>
    12 #include <sstream>
    13 const int INF=0x3f3f3f3f;
    14 typedef long long LL;
    15 const int mod=1e9+7;
    16 const int maxn=1e5+10;
    17 using namespace std;
    18 
    19 map<string,string> mp;
    20 
    21 int main()
    22 {
    23     #ifdef DEBUG
    24     freopen("sample.txt","r",stdin);
    25     #endif
    26     
    27     mp["0"]="0000"; mp["1"]="0001"; mp["2"]="0010"; mp["3"]="0011"; mp["4"]="0100";
    28     mp["5"]="0101"; mp["6"]="0110"; mp["7"]="0111"; mp["8"]="1000"; mp["9"]="1001";
    29     mp["A"]="1010"; mp["B"]="1011"; mp["C"]="1100"; mp["D"]="1101"; mp["E"]="1110"; mp["F"]="1111";
    30     
    31     mp["000"]="0"; mp["001"]="1"; mp["010"]="2"; mp["011"]="3"; 
    32     mp["100"]="4"; mp["101"]="5"; mp["110"]="6"; mp["111"]="7";
    33     
    34     int n;
    35     cin>>n;
    36     string str;
    37     while(n--)
    38     {
    39         cin>>str;        //十六进制 
    40         string temp="";    //存二进制 
    41         string ans="";    //存八进制 
    42         for(int i=0;i<str.size();i++)//十六进制转换成二进制 
    43             temp+=mp[str.substr(i,1)];
    44         while(temp.size()%3)//位数不足,前面补齐0 
    45             temp="0"+temp;
    46         int flag=0;
    47         for(int i=0;i<=temp.size()-3;i+=3)//二进制转换成八进制 
    48         {
    49             if(flag==0)//除去前导0 
    50             {
    51                 if(mp[temp.substr(i,3)]=="0") continue;
    52                 else flag=1;
    53             }
    54             ans+=mp[temp.substr(i,3)];
    55         }
    56         cout<<ans<<endl;
    57     }
    58     
    59     return 0;
    60 }

    -

  • 相关阅读:
    关于动态库 DLL同名或者重名的问题总结
    UMDH使用步骤
    点是否在多边形内
    TOMCAT 显示 Context [/zhgsServer] startup failed due to previous errors
    删除 windows 服务中某条记录
    SQL SERVER 分页查询
    SQL Server中 ldf 文件过大的解决方法
    远程关机和远程重启
    把HBITMAP 保存图片文件.
    哲学与算法——高斯混合模型算法
  • 原文地址:https://www.cnblogs.com/jiamian/p/12285971.html
Copyright © 2011-2022 走看看