基礎練習 十進制轉十六進制
問題描述
十六進制數是在程序設計時經常要使用到的一種整數的表示方式。它有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;
}