蓝桥 20-07-27 基础练习 十六进制转八进制

蓝桥杯 基础练习 十六进制转八进制

题目已经说明了每个十六进制数长度不超过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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值