蓝桥杯学习记录
一、测试练习:
问题名称:十六进制转八进制
问题描述:
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式:
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式:
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入:
2
39
123ABC
样例输出:
71
4435274
解题思路:
先把十六进制转换成二进制再转换成八进制
代码:
#include <iostream>
#include <stack>
#include<queue>
using namespace std;
//十六进制转八进制
string convertwo(char s){
switch(s)
{
case '0':
return "0000";
case '1':
return "0001";
case '2':
return "0010";
case '3':
return "0011";
case '4':
return "0100";
case '5':
return "0101";
case '6':
return "0110";
case '7':
return "0111";
case '8':
return "1000";
case '9':
return "1001";
case 'A':
return "1010";
case 'B':
return "1011";
case 'C':
return "1100";
case 'D':
return "1101";
case 'E':
return "1110";
case 'F':
return "1111";
default:
break;
}
}
int converten(char *p){
switch(p[0]){
case '0':
{
switch(p[1]){
case '0':
{
switch (p[2]){
case '0':
return 0;
case '1':
return 1;
}
}
case '1':
{
switch (p[2]){
case '0':
return 2;
case '1':
return 3;
}
}
}
}
case '1':
{
switch(p[1]){
case '0':
{
switch (p[2]){
case '0':
return 4;
case '1':
return 5;
}
}
case '1':
{
switch (p[2]){
case '0':
return 6;
case '1':
return 7;
}
}
}
}
}
}
int main()
{
int n;
cin>>n;
string str[n];
for(int i = 0; i < n; i++)
cin>>str[i];
queue<char> Q;
stack<int> S;
char temp[3];
for(int i = 0; i < n; i++){
for(int j = str[i].size()-1; j >= 0; j--){
string m = convertwo(str[i][j]);
for(int k = 3; k >= 0; k--)
Q.push(m[k]);
for(int k = 2; k >= 0; k--){
temp[k] = Q.front();
Q.pop();
}
char *p = &temp[0];
S.push(converten(p));
}
while(!Q.empty()){
int cot = 0;
for(int i = 0; i < 2; i++)
temp[i] = '0';
for(int i = 2; i >= 0; i--){
if(Q.empty()) continue;
temp[i] = Q.front();
Q.pop();
cot++;
}
char *p = &temp[0];
S.push(converten(p));
}
while(S.top() == 0)
S.pop();
while(!S.empty())
{
cout<<S.top();
S.pop();
}
cout<<endl;
}
return 0;
}