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

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

C/C++ 十六进制转八进制 利用bitset预处理,将十进制转换为对应二进制数