藍橋杯——進制轉換練習

基礎練習 十進制轉十六進制

問題描述

十六進制數是在程序設計時經常要使用到的一種整數的表示方式。它有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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章