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

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

神题膜拜传送门:戳这里

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

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

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

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

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过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++代码

#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

标签: 蓝桥杯, C++
返回文章列表 文章二维码
本页链接的二维码
打赏二维码