蓝桥杯——十六进制转八进制

题目

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

解析

如果你是想通过计算将十六进制转换成八进制,这将是一场噩梦。如果你再这题使用了错误的数据类型,这也将是一场噩梦。

正确的解题思路是将十六进制先转换成二进制,再转换成八进制。
Q:如何十六进制转为二进制?
A:将十六进制数用字符串存放,遍历字符串,将与之匹配的四位二进制数存放到特定字符串中。如十六进制39,第一个字符是3,将0011存放在特定字符串str中,第二个字符是9,将1001加在str的后面

Q:如何二进制转八进制?
A:判断现有二进制字符串,将其补为3的倍数方便转换,之后遍历二进制字符串,每三位字符相加计算得出八进制类型的数值,之后再将数转为字符放入字符串,即可得到首部含0的八进制数串

代码

代码已通过蓝桥杯系统

#include<iostream>
using namespace std;

int main()
{
	int line;	
	cin>>line;
	for(int i=0;i<line;i++)
	{
		string stringsixteen;
		string stringtwo;
		string stringeight;
		cin>>stringsixteen;
		
		for(int j=0;j<stringsixteen.length();j++)   //16进制转二进制 
		{
			switch(stringsixteen[j])
			{
				case '0':
					stringtwo += "0000";break;
				case '1':
					stringtwo += "0001";break;
				case '2':
					stringtwo += "0010";break;
				case '3':
					stringtwo += "0011";break;
				case '4':
					stringtwo += "0100";break;
				case '5':
					stringtwo += "0101";break;
				case '6':
					stringtwo += "0110";break;
				case '7':
					stringtwo += "0111";break;
				case '8':
					stringtwo += "1000";break;
				case '9':
					stringtwo += "1001";break;
				case 'A':
					stringtwo += "1010";break;
				case 'B':
					stringtwo += "1011";break;
				case 'C':
					stringtwo += "1100";break;
				case 'D':
					stringtwo += "1101";break;
				case 'E':
					stringtwo += "1110";break;
				case 'F':
					stringtwo += "1111";break;
				default: break;
			}
		}
		if(stringtwo.length()%3 == 1)
			stringtwo = "00" + stringtwo;
		if(stringtwo.length()%3 == 2)
			stringtwo = "0" + stringtwo;
		
		for(int i=0;i<stringtwo.length()-2;i+=3)      //2进制转8进制 
		{
			int temp = 4*(stringtwo[i] - '0')+2*(stringtwo[i+1] - '0')+(stringtwo[i+2] - '0');
			stringeight += (temp + '0');	
		}
		int j = 0;
		while(stringeight[j] == '0')
			j++;
		for(int i=j;i<stringeight.length();i++)
			cout<<stringeight[i];
		cout<<endl; 
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44078014/article/details/107696935
今日推荐