题目分析

把一串0 1组成的的序列转化为32进制,实质上就是将2进制转换为32进制。

25^5 = 32,所以恰好可以用5位 2进制 表示一位 32进制

由于这串序列的长度可能不是5的整数倍,所以我们需要在字符串前面 补字符0 以使得序列的长度成为5的整数倍。

然后我们可以将字符串每5个分成一组来处理。

额外考虑(不在数据之内)--------认为这里应该加强数据

在常规的进制转换中,例如:0000000000000000 这样的二进制只能被转为 0 ,所以我们需要将第一个 字符'1' 之前的 字符'0' 都删除掉,再根据剩余位数是否是5的整数倍在新的串序列前补0。如果一直遍历到最后发现没有遇到 字符'1' ,则直接将整串序列赋值为 字符串"0"

代码(有注释版本)

#include<iostream>
using namespace std;

// 将5位的二进制转换为1位三十二进制,因为三十二进制包含非数值,所以返回char类型
char get(string s){
    int sum = 0,t = 1;
    for(int i = 4;i >= 0; i--){
        if(s[i] == '1') sum += t;
        t *= 2;    // 也可以写成 t <<= 1
    }
    
    char ch;
    if(sum < 10) ch = sum + '0';
    else ch = (sum - 10) + 'A';
    
    return ch;
}

int main(){
    string s,t;
    
    while(cin >> s){            // 有多组测试数据,循环输入,无输入即结束循环
        //防止前面一串0
        for(int i = 0; i < s.size(); i++){
            if(s[i] != '0'){    // 寻找第一个字符'1'
                s = s.substr(i,s.size());
                break;
            }
            if(i == s.size()-1) s = "0";    //如果遍历到最后一个还不是字符'1',则将整串赋值为字符串"0"
        }

        // 根据串的长度还差几个正好是5的整数倍,在字符串前补几个字符'0'
        switch(s.size() % 5){
            case 1: s = "0" + s;
            case 2: s = "0" + s;
            case 3: s = "0" + s;
            case 4: s = "0" + s;
            default:break;
        }
        
        // 将字符串每五个分为一组,每次输出一组
        for(int i = 0;i < s.size(); i = i+5){
            t = s.substr(i,5);
            cout << get(t);
        }
        
        cout << endl;
    }
    
    return 0;
}

代码(无注释版本)

#include<iostream>
using namespace std;

char get(string s){
    int sum = 0,t = 1;
    for(int i = 4;i >= 0; i--){
        if(s[i] == '1') sum += t;
        t *= 2;
    }
    
    char ch;
    if(sum < 10) ch = sum + '0';
    else ch = (sum - 10) + 'A';
    
    return ch;
}

int main(){
    string s,t;
    
    while(cin >> s){
        
        for(int i = 0; i < s.size(); i++){
            if(s[i] != '0'){    
                s = s.substr(i,s.size());
                break;
            }
            if(i == s.size()-1) s = "0";
        }

        switch(s.size() % 5){
            case 1: s = "0" + s;
            case 2: s = "0" + s;
            case 3: s = "0" + s;
            case 4: s = "0" + s;
            default:break;
        }
        
        for(int i = 0;i < s.size(); i = i+5){
            t = s.substr(i,5);
            cout << get(t);
        }
        
        cout << endl;
    }
    
    return 0;
}