十进制转十六进制
问题描述
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有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<cmath>
using namespace std;
int main()
{
int a;
cin>>a;
if(a != 0)
{
string str = "0123456789ABCDEF" ;
int k=floor(log(a)/log(16))+1; // 向下取整 (转化后十六进制的位数)
int *tmp = new int[k];
int i=0;
while(a != 0)
{
tmp[i++] = a%16;
a = a/16;
}
for(int i=k-1; i>=0; i--)
{
cout<<str[tmp[i]];
}
}
else
{
cout<<0; //注意输入为零的处理
}
return 0;
}
十进制与各进制之间的转换
题目描述
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数
输入描述:
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述:
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)
示例1
输入
7 2
输出
111
string Convert(int m, int n)
{
string s = "";
string table = "0123456789ABCDEF";
int flag = 0;
if(m < 0)
{
flag = 1;
m = -m;
}
while(m)
{
s = table[m%n] +s ;
m = m/n;
}
if(flag == 1)
{
s = "-" + s;
}
return s;
}
int main()
{
int m, n;
while(cin>>m>>n)
{
cout<<Convert(m,n)<<endl;
}
return 0;
}
注:若输入为负数的话,转换之后的进制应该加上 - 号。
十六进制转十进制
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串(注:转化为10进制时大于整形最大值,应定义 long long ),将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
string hex;
cin>>hex;
int size = hex.size();
long long dec = 0; //类型应为long long
for(int i=0; i<size; i++)
{
int tmp;
if(hex[i] >= '0' && hex[i] <= '9' )
{
tmp = hex[i] - '0';
}
else
{
tmp = hex[i] - 'A' + 10;
}
dec += pow(16, size-1-i)* tmp;
}
cout<<dec ;
return 0;
}
十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
思路:
1.十六进制转十进制,十进制转八进制
2.十六进制转二进制,二进制转八进制
这里由于 输入的每个十六进制数长度不超过100000,若采用思路1 会超时,这里采用思路2
16进制每一个位子上的数字都可以变成4位的2进制数,而每3个二进制数又可以组成8进制上对应位子的数字。
#include<iostream>
#include<string>
using namespace std;
//十六-->二
string HexToBin(string& hex)
{
string arr[16] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000",
"1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int size = hex.size();
string binary;
for(int i=0; i<size; i++)
{
int tmp = 0;
if(hex[i]>='0' && hex[i]<='9')
{
tmp = hex[i] - '0';
}
else
{
tmp = hex[i] - 'A' + 10;
}
binary += arr[tmp];
}
return binary;
}
string BinToOct(string& bin)
{
int size = bin.size();
string oct;
if(size%3 == 1)
{
bin = "00" + bin;
}
if(size%3 == 2)
{
bin = "0" + bin;
}
for(int i=0; i<size; i+=3)
{
int tmp = 4*(bin[i]-'0') + 2*(bin[i+1]-'0')+ 1*(bin[i+2]-'0');
if(i==0 && tmp== 0)//去除第一个零
{
continue;
}
oct += (tmp+'0');
}
return oct;
}
int main()
{
int n;
cin>>n;
while(n--)
{
string input;
cin>>input;
string bin = HexToBin(input);
string oct = BinToOct(bin);
cout<<oct<<endl;
}
return 0;
}