进制转换

本文详细介绍了不同进制之间的转换方法,包括十进制与十六进制、八进制的相互转换,提供了具体的算法实现和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

十进制转十六进制

问题描述

  十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值