基础练习 十进制转十六进制
问题描述
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
给出一个非负整数,将它表示成十六进制的形式。
输入格式
输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
输出格式
输出这个整数的16进制表示
样例输入
30
样例输出
1E
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<map>
using namespace std;
map<int,string>types;
int main()
{
types[0] = "0";types[1] = "1";types[2] = "2";types[3] = "3";
types[4] = "4";types[5] = "5";types[6] = "6";types[7] = "7";
types[8] = "8";types[9] = "9";types[10] = "A";types[11] = "B";
types[12] = "C";types[13] = "D";types[14] = "E";types[15] = "F";
string s16;
long long n;//n是十进制数,要转成16进制数
cin>>n;
//如果n是0,直接输出0退出程序
if(n == 0){
cout<<0<<endl;
return 0;
}
//如果n小于0,先输出负号,再按照正数进行处理
if(n < 0){
cout<<"-";
n = -n;
}
//除16取余
while(n){
s16.insert(0,types[n%16]);//余数插到首位
n = n/16;
}
cout<<s16<<endl;
return 0;
}
基础练习 十六进制转十进制
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<map>
using namespace std;
map<char,int>types;
int main()
{
types['0'] = 0;types['1'] = 1;types['2'] = 2;types['3'] = 3;
types['4'] = 4;types['5'] = 5;types['6'] = 6;types['7'] = 7;
types['8'] = 8;types['9'] = 9;types['A'] = 10;types['B'] = 11;
types['C'] = 12;types['D'] = 13;types['E'] = 14;types['F'] = 15;
string s16;//s16是16进制数的字符串形式,
long long n = 0;//n是转换成的十进制数,初值置为0
cin>>s16;
//如果为0,直接输出0并退出程序
if(s16 == "0"){
cout<<0<<endl;
return 0;
}
//题目中规定输入的十六进制为正数
for(int i=0;i<s16.length();i++){
n *= 16;//位权 或改写成 n= n << 4;
n += types[s16[i]];//添加尾数
}
cout<<n<<endl;
return 0;
}
基础练习 十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
解题思路
思路是先将16进制的数装换成某进制数,然后装换成八进制数。
由于每个十六进制数长度不超过100000,显然不能用long long存放,必须全部看作字符串的形式。
那么,可以先将十六进制的数装换成二进制,然后从二进制装换成八进制。
十六进制每一位对应4位二进制数,每3位二进制数对应一位八进制数。
其中:
- 十六进制的每位0-F对应着二进制的0000-1111
- 八进制的每位0-7对应着二进制的000-111
- 采用map存储字符串之间的映射关系,如十六进制对应二进制"0"–>“0000”,“A”–>“1010”,二进制对应八进制"010"–>“2”
- 转换成的0-1字符串(二进制字符串)的长度如果不是3的倍数,向其字符串的首位插入前导0直至长度是3的倍数
- 最后装换成的八进制串要清除前导0,直至首位不是前导0之后再输出
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<map>
using namespace std;
//十六进制转八进制
//方法:先转成二进制,然后转成十六进制
string sixteento2(string s16)
{
string s2;
map<char,string>types;
types['0'] = "0000";types['1'] = "0001";types['2'] = "0010";types['3'] = "0011";
types['4'] = "0100";types['5'] = "0101";types['6'] = "0110";types['7'] = "0111";
types['8'] = "1000";types['9'] = "1001";types['A'] = "1010";types['B'] = "1011";
types['C'] = "1100";types['D'] = "1101";types['E'] = "1110";types['F'] = "1111";
for(int i=0;i<s16.length();i++){
;;
s2.append(types[s16[i]]);
}
return s2;
}
//2进制转8进制
string doubleto8(string s2)
{
map<string,string>types;
types["000"] = "0";types["001"] = "1";types["010"] = "2";types["011"] = "3";
types["100"] = "4";types["101"] = "5";types["110"] = "6";types["111"] = "7";
string s8;
//如果二进制串长度不是3的倍数,进行补齐操作
if(s2.length()%3 == 1)
s2.insert(0,"00");
else if(s2.length()%3 == 2)
s2.insert(0,"0");
for(int i=0;i<=s2.length()-3;i=i+3){
s8.append(types[string(s2,i,3)]);
}
//除去可能存在的前导0
while(s8[0] == '0')
s8 = string(s8,1,s8.length()-1);
return s8;
}
int main()
{
int m;//每次转换m次
cin>>m;
for(int i=1;i<=m;i++){
string s;
cin>>s;
string sout = doubleto8(sixteento2(s));
cout<<sout<<endl;
}
return 0;
}