蓝桥杯 基础练习 十六进制转八进制
题目已经说明了每个十六进制数长度不超过100000。
长度足够的时候,数字已经非常大了。所以不能用int或者long long把十六进制先转成十进制在转为八进制过程中的数字存储起来。
利用的思路是:先将每1位十六进制数转换成4位二进制,补够位数后,再把每1位二进制转换为1位八进制,然后再按序输出(前置的0忽略)。
比如题目给的例子:
代码:
# include <iostream>
# include <string>
using namespace std;
/*每一位十六进制数字都可以转换为四位二进制数字*/
string change(char n){
string num;
switch(n){
case '0':num="0000";break;
case '1':num="0001";break;
case '2':num="0010";break;
case '3':num="0011";break;
case '4':num="0100";break;
case '5':num="0101";break;
case '6':num="0110";break;
case '7':num="0111";break;
case '8':num="1000";break;
case '9':num="1001";break;
case 'A':num="1010";break;
case 'B':num="1011";break;
case 'C':num="1100";break;
case 'D':num="1101";break;
case 'E':num="1110";break;
case 'F':num="1111";break;
default:break;
}
return num;
}
/*补齐位数,确保二进制数字的长度是3的倍数,才能转换为八进制*/
string supply(string str){
int len = str.size();
if(len%3==0)
return str;
else if(len%3==1)
return "00"+str;
else
return "0"+str;
}
/*每三位二进制数字都可以转换为一位八进制数字*/
char convert(char a,char b,char c){
int a_ = a-48;
int b_ = b-48;
int c_ = c-48;
int out = a_*4+b_*2+c_;
return out+48;
}
int main()
{
int n,i,j;
string num;
cin>>n;
/*循环次数*/
while(n--){
cin>>num;/*输入十六进制数字字符串*/
string to16_2="",to2_8="";
int len1 = num.size();
for(i=0;i<len1;i++){
to16_2 += change(num[i]);/*把每一位十六进制数字转换为二进制再串起来*/
}
to16_2 = supply(to16_2);/*补够位数*/
int len2 = to16_2.size();
for(i=0;i<=(len2-3);i=i+3){
to2_8 += convert(to16_2[i],to16_2[i+1],to16_2[i+2]);/*变成八进制*/
}
int flag=0,len3 = to2_8.size();
for(i=0;i<len3;i++){/*输出*/
if(to2_8[i]!='0'){
flag=1;
}
if(flag==1){
cout<<to2_8[i];
}
}
cout<<endl;
}
return 0;
}