【蓝桥杯】十六进制转八进制 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;
}
相关推荐
CoovallyAIHub9 分钟前
200亿美元“反向收购雇佣”?老黄天价应对谷歌TPU压力
深度学习·算法·计算机视觉
落尘29811 分钟前
Catlass 模板库调试调优经验与踩坑记录
算法
ytttr87312 分钟前
叠前同步反演纵波速度、横波速度和密度三参数
算法
初圣魔门首席弟子20 分钟前
智能指针使用bug
c++·算法
好易学·数据结构30 分钟前
可视化图解算法75:最长上升子序列(最长递增子序列)
数据结构·算法·leetcode·动态规划·力扣·牛客网
Jeremy爱编码30 分钟前
leetcode热题岛屿数量
算法·leetcode·职场和发展
闻缺陷则喜何志丹33 分钟前
【组合数学 动态规划】P6870 [COCI2019-2020#5] Zapina|普及+
c++·数学·算法·动态规划·组合数学
zl_vslam35 分钟前
SLAM中的非线性优-3D图优化之相对位姿Between Factor-SO3/t形式(十一)
人工智能·算法·计算机视觉·3d
aini_lovee42 分钟前
基于 OpenCV 的模板匹配算法的 C 语言实现
c语言·opencv·算法
core51242 分钟前
EM 算法 (期望最大化):在迷雾中寻找真相
算法·em·期望最大化