C/C++ 十六进制转八进制 利用bitset预处理,将十进制转换为对应二进制数
程序员文章站
2022-07-15 08:42:25
...
一、题目描述
蓝桥杯练习系统:基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
二、解题思路
(1)规则:一个十六进制数对应4个二进制位;一个八进制数对应3个二进制位;
(2)根据规则,先将十六进制数转换为对应的二进制数,再将二进制数从低位到高位,每3位转换成一个八进制数即可。
(3)利用bitset,可将一个十进制长整型(long)数转换为对应的二进制数。将16和8进制的基本元素转换出对应的二进制。
三、AC代码
#include<iostream>
#include<bitset>
#include<cstring>
using namespace std;
string b16[16];//保存0-15中每个数字对应的4位二进制数
string b8[8];//保存0-7中每个数字对应的3位二进制数
int a[]={1,2,4};
int main(){
//借用bitset将一个长整型数转换为其二进制格式
for(int i=0;i<16;++i) b16[i]=bitset<4>((long)i).to_string();//16进制对应的2进制
for(int i=0;i<8;++i) b8[i]=bitset<3>((long)i).to_string();//8进制对应的2进制
int n,i,num;
cin>>n;
string s,ts,cs;
while(n--){
ts="";
cin>>s;
for(i=0;i<s.size();++i){//十六进制转二进制
if(s[i]<='9')
ts.append(b16[s[i]-'0']);
else ts.append(b16[s[i]-'A'+10]);
}
//cout<<ts<<endl;
cs="";
num=0;
for(i=ts.size()-1;i>=0;i-=3){//二进制转八进制(3个二进制位为一个八进制数)
if(i<=2){//高位<=3位,单独判断 ,去前导0
int j=0;
while(i>=0){
num+=a[j++]*(ts[i--]-'0');
}
if(num) cs.insert(cs.begin(),(char)(num+'0'));
break;
}
cs.insert(cs.begin(),(char)(a[0]*(ts[i]-'0')+a[1]*(ts[i-1]-'0')+a[2]*(ts[i-2]-'0')+'0'));
}
cout<<cs<<endl;
}
return 0;
}
上一篇: 2. 求和为给定值的两个数