用户登录
用户注册

分享至

蓝桥杯题解-十六进制转八进制-BASIC-12

  • 作者: 武大地
  • 来源: 51数据库
  • 2021-09-01

原题地址:十六进制转八进制

问题描述

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

输入格式

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

输出格式

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

【注意】

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

样例输入

2
39
123ABC

样例输出

71
4435274

【提示】

先将十六进制数转换成某进制数,再由某进制数转换成八进制

解1:

1.十六进制先转十进制(参考BASIC-10-十六进制转十进制),然后再除八取余。

QAQ怎么会有问题,我自己测试完美啊。
我点击了第二个锦囊,提示我先转为二进制。而且我看了些其他人的解,决定先搁置十进制为中间进制的方法,转为用二进制。
代码暂时先贴这里。

代码1:
#include"iostream"
#include"string"
#include"cmath"
using namespace std;
void changeto8(int a)
{
	int p;//p保存除16取余的值
	p=a%8;//先取余
	a/=8;//再/=
	if(a>0)
		changeto8(a);//然后递归
	cout<<p;
}

int main()
{
	int n;//转换个数
	string s[10];//保存十六进制数
	int a[10]={0};//保存十进制
	cin>>n;
	fflush(stdin);
	for(int i=0;i<n;i++)
		getline(cin,s[i]);
	for(int num=0;num<n;num++)//计算十进制
		for(int i=(s[num].length()-1),j=0;i>=0;j++,i--)
		{
			if(int(s[num][i])>=65) 
				a[num]+=(int(s[num][i])-55)*pow(16.0,j);
			else
				a[num]+=(int(s[num][i])-48)*pow(16.0,j);
		}
	for(int num=0;num<n;num++)//算八进制
	{
		changeto8(a[num]);
		cout<<endl;
	}
	return 0;
}

解2:

二进制转八进制尚未完成。

代码2:
#include"iostream"
#include"string"
#include"cmath"
using namespace std;

int main()
{
	int n;//转换个数
	string s[10];//保存十六进制数
	string ba;//保存当前八进制数
	string a[10];//保存二进制
	cin>>n;
	fflush(stdin);//清空键盘缓存
	for(int i=0;i<n;i++)
		getline(cin,s[i]);
	for(int num=0;num<n;num++)//遍历n个数,从下标为0的开始
	{
		for(int i=0;i<s[num].length();i++)//从最高位开始计算二进制
		{
			if(int(s[num][i])>=65) 
			{
				for(int shi=int(s[num][i])-55,j=3;j>=0;j--)
					{
						if(shi/int(pow(2.0,j)))a[num].push_back('1');
						else a[num].push_back('0');
						shi%=int(pow(2.0,j));
					}
			}
			else
			{
				for(int shi=int(s[num][i]-48),j=3;j>=0;j--)
						{
							if(shi/int(pow(2.0,j)))a[num].push_back('1');
							else a[num].push_back('0');
							shi%=int(pow(2.0,j));
						}
			}
		}
		//cout<<a[num]<<endl;//二进制输出来看看,前面会有0
	}
/*
	int e=0;//放每三位转换八进制后的数
	for(int num=0;num<n;num++)//八进制转换并输出
	{
		for(int l=a[num].length()-1,e=0;l%3>=0&&l>0;e=0,l-=3)
		{
			if(l%3==0)//三位
			{
				e+=pow(2.0,2)*a[num][l-2];
				e+=pow(2.0,1)*a[num][l-1];
				e+=a[num][l];
				ba.push_back(e);
				cout<<"3."<<e<<" ";//
			}
			else if(l%3==2)//两位
			{
				e+=pow(2.0,1)*a[num][l-1];
				e+=a[num][l];
				ba.push_back(e);
				cout<<"2."<<e<<" ";//
			}
			else if(l%3==1)//一位
			{
				e+=a[num][l];
				ba.push_back(e);
				cout<<"3."<<e<<" ";//
			}
			
		}
		/*for(int l=ba.length()-1;l>=0;l--)//输出
		{
			cout<<ba[l];
		}*/
		cout<<endl;//输出每个八进制后换行
		ba.clear();//输出完要清空,只申请了一个空间给八进制,而且添加用的是pushback
		e=0;//e也要清空
	}
*/
	return 0;
}

题解目录

软件
前端设计
程序设计
Java相关