蓝桥杯_16进制转8进制算法

      

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

  【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

  【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

 

最开始,当我看到这个题目的认为比较简单,最初的代码是直接使用了这两个函数scanf("%x"),printf("%o"),结果一提交上去,0分,郁闷了好久....  在网上了解了别人的解决思想后,经过一番调试,终于解决了这个问题,所以打算在这里来总结一下。

 

首先,在题目中要求输入的16进制的长度不能超过100000,这个长度哪怕是long long类型也容纳不下,所以我们会优先考虑用字符串的形式来存放输入的16进制数据。由于每一个16进制数据占4个二进制位,而每一个8进制数据占3个二进制位。所以在这里我是将输入的16进制字符串转换为相应的二进制字符串,再将所得到的二进制字符串每三个一组,转换为相应的8进制字符串,进而将它输出。

 

但在这里,我们要注意几个问题:

1:由于二进制转换为8进制是每三个二进制一组的,所以当二进制字符串的长度不是3的整数倍的时候,就要在字符串的前面补上相应个数的 ‘0’ 来让二进制字符串的长度变成3的整数倍。

2:当上续过程转换完毕后,不要让8进制字符串前面的 ‘0’ 字符输出。(比如:八进制字符串为071时,应该输出为71)。

 

代码如下:

 

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
	int n = 0;
	cin >> n;
	 
	string str_Hex, str_Bin;
	string *str_Oct = new string[n];
	
	for(int i = 0; i < n; i++)
	{
		str_Hex = "";
		str_Bin = "";
		str_Oct[i] = "";
		cin >> str_Hex;
		for(int j = 0; j < str_Hex.size(); j++)
		{
			switch(str_Hex[j])
			{
				case '0': str_Bin += "0000"; break;
				case '1': str_Bin += "0001"; break;
				case '2': str_Bin += "0010"; break;
				case '3': str_Bin += "0011"; break;
				case '4': str_Bin += "0100"; break;
				case '5': str_Bin += "0101"; break;
				case '6': str_Bin += "0110"; break;
				case '7': str_Bin += "0111"; break;
				case '8': str_Bin += "1000"; break;
				case '9': str_Bin += "1001"; break;
				case 'A': str_Bin += "1010"; break;
				case 'B': str_Bin += "1011"; break;
				case 'C': str_Bin += "1100"; break;
				case 'D': str_Bin += "1101"; break;
				case 'E': str_Bin += "1110"; break;
				case 'F': str_Bin += "1111"; break;
				default: break;
			}
		}
		
		//在二进制字符串的前面补'0',使得它的长度为3的整数倍 
		if((str_Bin.size() % 3) == 1)
			str_Bin = "00" + str_Bin;
		if((str_Bin.size() % 3) == 2)
			str_Bin = "0" + str_Bin;
					
		int d = 0;
		for(int k = 0; k < str_Bin.size(); k += 3)
		{
			//将每3个二进制字符转换为相应的整数 
			d = 4*(str_Bin[k] - '0') + 2*(str_Bin[k+1] - '0') + (str_Bin[k+2] - '0');
			str_Oct[i] += (d + '0');
		}
	}
	
	for(int i = 0; i < n; i++)
	{
		//去除输出前面的'0'字符 
		int k = 0;	
		while(str_Oct[i][k] == '0') 
			k++;
			
		cout << &str_Oct[i][k] << endl;
	}
	
	delete []str_Oct;
	str_Oct = NULL;
	return 0;
} 

 

 

 

 

 

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值