0%

蓝桥杯练习 十六进制转八进制的思路

前段时间,金标给了我道题目,是蓝桥杯练习系统的初级题,据说大神标解不出来….

神题膜拜传送门:戳这里

好吧,还是贴一下,问题如下(ACM的格式):

基础练习 十六进制转八进制

时间限制:1.0s
内存限制:512.0MB(NM,这个内存限制还叫内存限制吗)

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

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

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

  【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274


虽然平时开发我都用Java,但是觉得有时候还是直接操作底层的C/C++比较好用,于是乎,直接上C++…
看了一下题目,一万位数….这个已经超出了long long的范围了….
根据以往的经验(参见我的C语言课程设计),果断上字符串
这个程序设计的时候,思路大体是 HEX十六进制 -> BIN二进制 -> OCT八进制
这个是可以直接通过字符串变换的,用C++的标准库里面的string直接比较就好…. O.o
因为十六进制一位数对应4位二进制数,所以十六进制转二进制直接用字符拼接
P.S 具体怎么换,参考这里
然后二进制转八进制就有点麻烦了,因为每1位8进制数对应3位二进制,因此我们需要将二进制转换成若干段,每段3位数字,再进行转换.

上面的思路可以转换为下面的C++代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include<iostream>
#include<string>
#define MAXN 10
using namespace std;

string converseToBinary(string hex){
string bin;
for (int i = 0; i < hex.length(); i++){
switch(hex[i]){
case '0':bin += "0000";break;
case '1':bin += "0001";break;
case '2':bin += "0010";break;
case '3':bin += "0011";break;
case '4':bin += "0100";break;
case '5':bin += "0101";break;
case '6':bin += "0110";break;
case '7':bin += "0111";break;
case '8':bin += "1000";break;
case '9':bin += "1001";break;
case 'A':bin += "1010";break;
case 'B':bin += "1011";break;
case 'C':bin += "1100";break;
case 'D':bin += "1101";break;
case 'E':bin += "1110";break;
case 'F':bin += "1111";break;
default :break;
}
}
return bin;
}

void outputOctString(string bin){
string oct;
int count = 0 ;
int num = 0;
char temp;
for (int i = bin.length()-1; i>=0;i--) {
if(bin[i]=='1'){
switch(count){
case 0: num += 1;break;
case 1: num += 2;break;
case 2: num += 4;break;
}
}
if(count==2){
oct += num + '0';
num = 0;
}
count = (count+1)%3;
}
if(count!=0){
oct += num + '0';
}
int len = oct.length();
for(int j=0;j<len/2;j++){
temp = oct[j];
oct[j] = oct[len-1-j];
oct[len-1-j] = temp;
}
int index = 0;
//忽略前导零
while(oct[index++] == '0');
/* 这里表问我为啥这样写,因为不这样写,傻逼测评系统不给过*/
for(index=index-1;index<len;index++){
printf("%c",oct[index]);
}
printf("\n");
}


int main(){
int n;
string hex[10];
string bin;
cin>>n;
for (int i = 0; i < n; ++i){
cin>>hex[i];
}
for (int i = 0; i < n; ++i) {
bin = converseToBinary(hex[i]);
outputOctString(bin);
}
return 0;
}

提交,大功告成…

BTW,吐槽一下蓝桥杯的OJ,这么慢,而且内存占用率这么高,一看就是Windows系统….
还有什么评判机制啊,不逐个print就不给过….

欢迎大家对我的思路提出你们的见解哦.

#EOF#