0
点赞
收藏
分享

微信扫一扫

蓝桥杯C/C++每日一练之十六进制转八进制

是归人不是过客 2022-01-30 阅读 86
第十三届蓝桥杯大赛个人赛省赛比赛将于2022年4月9日(星期六)举办,趁现在寒假的时间抓紧时间备战一下。因为博主本人报名是C/C++组,所以更新所有内容都是C/C++相关知识。题目全部都是蓝桥杯官网题库真题。今天是备战刷题的第一天。

题目:

输入格式:

输出格式:

【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。
🎈十六进制数有明确的规定,如果是字母开头前面必须加前导0
样例输入:

 2
 39
 123ABC

样例输出:

  71
 4435274

提示:

💎解题思路:
根据提示我们就可以找到解题思路,就是因为十六进制和八进制之间不好转换,我们就可以用二进制做中间值,先将十六进制转换成二进制,然后再将二进制转换成八进制。
代码分析:
在C++中有#include <string>字符串头文件,我们可以将十六进制数看作是一个字符串,首先定义一个字符串str,然后键盘输入这个字符串也就是十六进制数,然后是利用for循环,将每一位十六进制转换成二进制数(一位十六进制可以转换成四位二进制),代码中的s2也是一个字符串,起初s2赋值为"",这是空字符串。然后利用switch判断语句,将这一位对应的二进制数添加到s2。二进制转换成八进制是三位二进制转换成一位八进制数。如果位数不足的话,前面用0补齐。
重点是将二进制转换成八进制。每三位二进制转换成一位八进制。

int p=4*(s2[k]-'0')+2*(s2[k+1]-'0')+s2[k+2]-'0';

因为开始定义的s2为字符串,(s2[k]-'0')是第字符串第k位的ASCLL减去0的ASCLL,二进制只有0和1,所以最后相减也就是0和1的情况。

完整代码:

#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
cin>>n;
string str;
string s2;
for(int i=0;i<n;i++)
    {
        cin>>str;
        s2="";
        for(int j=0;j<str.length();j++)
        {///把每一位数转化成4位2进制数,存在s2中 
            switch(str[j])
                {
                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;
                }
           }
        ///每三个构成的数为8进制,凑s2成3的倍数 
           if(s2.length()%3==1)
            s2="00"+s2;
          if(s2.length()%3==2)
            s2="0"+s2;
        //用于排斥前面的0;     
            int flag=0;
         for(int k=0;k<s2.length()-2;k+=3)
            {
                int p=4*(s2[k]-'0')+2*(s2[k+1]-'0')+s2[k+2]-'0';
                if(p)
                flag=1;
                if(flag)//直到不为0后开始输出 
                cout<<p;
             } 
             cout<<endl;
    }
return 0;
}
举报

相关推荐

0 条评论