蓝桥杯——进制转换练习

基础练习 十进制转十六进制

问题描述

十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有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位二进制数对应一位八进制数。
其中:

  1. 十六进制的每位0-F对应着二进制的0000-1111
  2. 八进制的每位0-7对应着二进制的000-111
  3. 采用map存储字符串之间的映射关系,如十六进制对应二进制"0"–>“0000”,“A”–>“1010”,二进制对应八进制"010"–>“2”
  4. 转换成的0-1字符串(二进制字符串)的长度如果不是3的倍数,向其字符串的首位插入前导0直至长度是3的倍数
  5. 最后装换成的八进制串要清除前导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;
}
发布了97 篇原创文章 · 获赞 101 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/practical_sharp/article/details/103980856