题目分析
把一串0 1组成的的序列转化为32进制,实质上就是将2进制转换为32进制。
2 = 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;
}