十六进制转八进制

十六进制转八进制

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

#include<bits/stdc++.h>
using namespace std; 
int n;
string heList[16]=
{
	"0000","0001","0010","0011", //0-3
	"0100","0101","0110","0111", //4-7
	"1000","1001","1010","1011", //8-A
	"1100","1101","1110","1111", //B-F
};
string octalList[8]=
{
	"0","1","2","3",
	"4","5","6","7",
};
string HextoTwo(string s) //十六进制转二进制 
{
	int len = s.length();
	string ans;
	for(int i=0;i<len;i++)
	{
		if(s[i]>='0'&&s[i]<='9'){  
			int index = s[i]-'0';
			ans.append(heList[index]);	
		}else if(s[i]>='A'&&s[i]<='Z'){
			int index = s[i]-'0'-7; //A~F转换成数字 
			ans.append(heList[index]);	
		}	
	} 
	return ans;
}
string TwotoOctal(string s) //二进制转八进制 
{
	reverse(s.begin(),s.end());
	while((s.length()%3)!=0){ 
		s.append("0"); //补0 
	}
	string ans;
	int len = s.length();
	for(int i=0;i<len;i+=3){
		int index = 0;
		int t = 0;
		while(index<3){
			t+=(s[index+i]-'0')*pow(2,index);
			index++;
		}
		ans.append(octalList[t]);
	}
	reverse(ans.begin(),ans.end());
	return ans.substr(ans.find_first_not_of('0'));
}
int main()
{
	string ans[20];
	cin>>n; //输入行数 
	getchar();//清除回车符 
	for(int i =0;i<n;i++)
	{
		string s;
		getline(cin,s);
		string tmp = HextoTwo(s);//16->2
		ans[i] = TwotoOctal(tmp);//2->8
	}
	for(int i=0;i<n;i++)
	{
		cout<<ans[i]<<endl;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皓月长歌临风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值