蓝桥杯C/C++组备战第一天

164 阅读3分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。

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

题目:

给定n个十六进制正整数,输出它们对应的八进制数。

输入格式:

输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式:

输出n行,每行为输入对应的八进制正整数。

【注意】   输入的十六进制数不会有前导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;
}