第十三届蓝桥杯大赛个人赛省赛比赛将于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;
}