欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-27 21:20:48
原题地址:十六进制转八进制问题描述给定n个十六进制正整数,输出它们对应的八进制数。输入格式输入的第一行为一个正整数n (1<=n<=10)。  接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式输出n行,每行为输入对应的八进制正整数。【注意】输入的十六进制数不会有前导0,比如012A。输出......

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

问题描述

给定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;
}

题解目录

本文地址:https://blog.csdn.net/qq_43508196/article/details/85961943