【蓝桥杯】十六进制转八进制 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;
}
相关推荐
秋天的怀念_David2 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi3 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6183 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang3 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
2601_970703834 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你02144 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
ZhengEnCi5 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
Flynn Liang6 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai
liminla!6 小时前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法
维克兜率天7 小时前
【维克】指数调整:哪些股票会被“强制买入“?
人工智能·python·算法