【蓝桥杯】十六进制转八进制 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;
}
相关推荐
sulikey7 分钟前
一文彻底理解:如何判断单链表是否成环(含原理推导与环入口推算)
c++·算法·leetcode·链表·floyd·快慢指针·floyd判圈算法
Swift社区14 分钟前
LeetCode 402 - 移掉 K 位数字
算法·leetcode·职场和发展
_码力全开_39 分钟前
P1005 [NOIP 2007 提高组] 矩阵取数游戏
java·c语言·c++·python·算法·矩阵·go
墨染点香43 分钟前
LeetCode 刷题【124. 二叉树中的最大路径和、125. 验证回文串】
算法·leetcode·职场和发展
Camel卡蒙43 分钟前
红黑树详细介绍(五大规则、保持平衡操作、Java实现)
java·开发语言·算法
AhriProGramming1 小时前
Flask-SQLAlchemy精读-双语精选文章
python·算法·flask
孤廖1 小时前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
BanyeBirth2 小时前
C++动态规划——LIS(最长不下降子序列)
算法·动态规划