十六进制转八进制(进制关系)

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,01012,所以前面的二进制转为十六进制为 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 }

-

原文地址:https://www.cnblogs.com/jiamian/p/12285971.html

时间: 2024-10-25 05:47:04

十六进制转八进制(进制关系)的相关文章

快速十六进制转2进制和

如何快速的进行 2进制,10进制,16进制 的 相互转换先记住二进制 的8421首先我们来看一个二进制数:1111,它是多少呢? 你可能还要这样计算:1×2º+1×2¹+1×2²+1×2³=1×1+1×2+1×4+1×8=15. 我们必须直接记住1111每一位的权值,并且是从高位往低位记,:8.4.2.1. 即,最高位的权值为2³=8,然后依次是 2²=4,2¹=2,2º=1. 记住8 4 2 1,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值. 接下来我们练习 通过 8421

十六进制内所有进制转换!!!!速度快,运算简单,java

import java.util.Scanner; public class P2031 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); char chs[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//最大十六进制所有的数 while(sc.hasNext()){ int n = sc.n

十进制转换成十六进制、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进制的字符串"解决办法通过判断字符是否'\n'". 具体看下面代码,不是很好,但是水平有限. #ifndef _SCALECONVERT_ #define _SCALECONVERT_ /*================================ Macros ===================================*/ #define FALSE 0 #define TURE 1 #define MAX_ARRAY 10

题目1194:八进制----------------------进制转换用do-while就OK了

AC: #include<iostream> using namespace std; int main() { int N; while(cin>>N) { int a[50],i=0; do{ a[i++]=N%8; N/=8; }while(N!=0); for(int j=i-1;j>=0;j--) cout<<a[j]; cout<<endl; } return 0; }

C/C++之进制转换

二进制.八进制.十进制.十六进制之间转换 一. 十进制与二进制之间的转换 (1) 十进制转换为二进制,分为整数部分和小数部分 ① 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数.下面举例: 例:将十进制的168转换为二进制 得出结果 将十进制的168转换为二进制,(10101000)2 分析:第一步,将168除以2,商84,余数为0.

计算机中的进制

在学习编程的过程中,经常见到二进制,十进制,十六进制,到底进制表示什么意思呢?进制,字面意思,前进的制度,在数字方面,就是数字前进的制度,数字怎么向前进,那就是进位,我们在做加法运算的时候都会用到进位,8+3,我们会写个1,然后向前进一位,数数的时候更是如些,1,2,3......10, 我们不会再向下数11,12 ..... ,而是在心中放一个1, 然后再1,2,3,4,......10, 到10之后, 我们也不会向下数,而是在心中再记一个1,那么心中的数字就是2了,继续向下数,1,2,3,数

01-03 Java关键字、标识符、注释、常量和进制问题、变量和数据类型

1:关键字 (1)被Java语言赋予特定含义的单词 (2)特点: 全部小写. (3)注意事项: A:goto和const作为保留字存在. B:类似于Notepad++这样的高级记事本会对关键字有特殊颜色标记 2:标识符 (1)就是给类,接口,方法,变量等起名字的字符序列 (2)组成规则: A:英文大小写字母 B:数字 C:$和_ (3)注意事项: A:不能以数字开头 B:不能是java中的关键字 C:区分大小写 (4)常见的命名规则(见名知意) A:包 其实就是文件夹,用于把相同的类名进行区分

10进制转化成2进制,16进制

//写一个程序,将十进制,可以转换为2进制,八进制,十六进制,四进制 #include <stdio.h> #include <stdlib.h> /************************************************************************/ /* 将数字换算成2进制打印出来 */ /************************************************************************/