【蓝桥杯】十六进制转八进制 C++实现

1.题目信息

时间限制:1.0s 内存限制:512.0MB

问题描述

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

输入格式

输入的第一行为一个正整数n (1<=n<=10)。

接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式

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

【注意】

输入的十六进制数不会有前导0,比如012A。

输出的八进制数也不能有前导0。

样例输入

cpp 复制代码
2
39
123ABC

样例输出

cpp 复制代码
71
4435274

【提示】

先将十六进制数转换成某进制数,再由某进制数转换成八进制。

2.算法实现

  1. 数字输入改写成字符串输入利用switch语句 进行16进制到2进制的转换

  2. ps:为方便3位3位划分,2进制转8进制,字符串长度不是3的倍数的需要补0

  3. 通过algorithm库中的reverse函数翻转字符串和+=,完成补0操作,再翻转回来

  4. 利用switch语句和substr函数 进行2进制到8进制的转换

  5. 去0输出,flag标志判断

3.完整代码

cpp 复制代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    string s1,s2,ss;
    int n;
    cin>>n;
    while(n--){
        s1="";
        s2="";
        ss="";
       cin>>s1;
       cout<<s1<<" "<<s1.length()<<endl;
       for(int i=0;i<s1.length();i++){
        //switch 语句转化16进制为2进制
        switch(s1[i]){
            case '0':{s2+="0000";break;}
            case '1':{s2+="0001";break;}
            case '2':{s2+="0010";break;}
            case '3':{s2+="0011";break;}
            case '4':{s2+="0100";break;}
            case '5':{s2+="0101";break;}
            case '6':{s2+="0110";break;}
            case '7':{s2+="0111";break;}
            case '8':{s2+="1000";break;}
            case '9':{s2+="1001";break;}
            case 'A':{s2+="1010";break;}
            case 'B':{s2+="1011";break;}
            case 'C':{s2+="1100";break;}
            case 'D':{s2+="1101";break;}
            case 'E':{s2+="1110";break;}
            case 'F':{s2+="1111";break;}
            default:break;
        }
    }
    cout<<s2<<" 2进制"<<endl;
    //不一定是3的约数,所以要往前补0
    reverse(s2.begin(),s2.end());
    cout<<s2<<" 反转后"<<endl;
    int num=s2.length();
    if(num%3==1)s2+="00";
    else if(num%3==2)s2+="0";
    cout<<s2<<" 加0后"<<endl;
    //反转回来
    reverse(s2.begin(),s2.end());
    cout<<s2<<" 再反转"<<endl;
    //3位3位划分2进制转化为八进制
    for(int i=0;i<s2.length();i+=3){
        if(s2.substr(i,3)=="000")ss+="0";
        else if(s2.substr(i,3)=="001")ss+="1";
        else if(s2.substr(i,3)=="010")ss+="2";
        else if(s2.substr(i,3)=="011")ss+="3";
        else if(s2.substr(i,3)=="100")ss+="4";
        else if(s2.substr(i,3)=="101")ss+="5";
        else if(s2.substr(i,3)=="110")ss+="6";
        else if(s2.substr(i,3)=="111")ss+="7";
    }
    cout<<ss<<" 去0前"<<endl;
    //去0输入
    int flag=0;
    for(int i=0;i<ss.length();i++){
        if(flag==0&&ss[i]=='0')continue;
        cout<<ss[i];
        flag=1;
    }
    cout<<" 去0后"<<endl;
    }
    return 0;
}

4.补充

16进制转10进制

  • 16进制转2进制,按字符串处理,同上
  • 2进制转10进制,按数处理,用pow函数
cpp 复制代码
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
    string s1,s2;
        s1="";
        s2="";
       cin>>s1;
       for(int i=0;i<s1.length();i++){
        //switch 语句转化16进制为2进制
        switch(s1[i]){
            case '0':{s2+="0000";break;}
            case '1':{s2+="0001";break;}
            case '2':{s2+="0010";break;}
            case '3':{s2+="0011";break;}
            case '4':{s2+="0100";break;}
            case '5':{s2+="0101";break;}
            case '6':{s2+="0110";break;}
            case '7':{s2+="0111";break;}
            case '8':{s2+="1000";break;}
            case '9':{s2+="1001";break;}
            case 'A':{s2+="1010";break;}
            case 'B':{s2+="1011";break;}
            case 'C':{s2+="1100";break;}
            case 'D':{s2+="1101";break;}
            case 'E':{s2+="1110";break;}
            case 'F':{s2+="1111";break;}
            default:break;
        }
    }
    //2进制转10进制
    int sum=0;
    int len=s2.length();
    for(int i=0;i<len;i++){
        if(s2[i]=='1')sum+=pow(2,len-i-1);
    }
    cout<<sum;
    return 0;
}
相关推荐
墨有6664 小时前
哈希表从入门到实现,一篇吃透!
数据结构·算法·哈希算法
We་ct4 小时前
LeetCode 228. 汇总区间:解题思路+代码详解
前端·算法·leetcode·typescript
AIpanda8884 小时前
如何借助AI销冠系统提升数字员工在销售中的成效?
算法
啊阿狸不会拉杆4 小时前
《机器学习导论》第 7 章-聚类
数据结构·人工智能·python·算法·机器学习·数据挖掘·聚类
木非哲4 小时前
机器学习--从“三个臭皮匠”到 XGBoost:揭秘 Boosting 算法的“填坑”艺术
算法·机器学习·boosting
小辉同志4 小时前
437. 路径总和 III
算法·深度优先·广度优先
笨笨阿库娅4 小时前
从零开始的算法基础学习
学习·算法
不想睡觉_4 小时前
优先队列priority_queue
c++·算法
那个村的李富贵13 小时前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann
power 雀儿13 小时前
Scaled Dot-Product Attention 分数计算 C++
算法