【蓝桥杯】十六进制转八进制 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;
}
相关推荐
Tisfy2 分钟前
LeetCode 2187.完成旅途的最少时间:二分查找
算法·leetcode·二分查找·题解·二分
Mephisto.java29 分钟前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli29 分钟前
滑动窗口->dd爱框框
算法
丶Darling.31 分钟前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo52042 分钟前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法
jiyisuifeng19911 小时前
代码随想录训练营第54天|单调栈+双指针
数据结构·算法
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂1 小时前
实验4 循环结构
c语言·算法·基础题
新晓·故知1 小时前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
总裁余(余登武)2 小时前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法
Eric.Lee20212 小时前
音频文件重采样 - python 实现
人工智能·python·深度学习·算法·audio·音频重采样