这篇文章在我的洛谷博客上也有 https://www.luogu.org/blog/kyx0806/
这道题就是个暴力模拟
考验的其实是耐性和细致
难就难在情况的判定和对数字单元的理解
另外,为了不输出到一半突然出Error
最好是把结果存到一个数组里,最后一块输出
下面是我的代码,详解在代码里
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
char a[172112],b[22389];
int n;
const int s[60]={1,2,4,8,16,32,64};
int main()
{
int m=0,t=0;//m其实就是个位置符,t是存储数组的下标
cin>>a;
if(strlen(a)%8!=0)
{
cout<<"Error";
return 0;
}
//如果长度不是8的倍数,那肯定是假代码
for(int i=0;i<strlen(a);i++)
{
if(a[i]!='0'&&a[i]!='1')
{
cout<<"Error";
return 0;
}
}
//如果代码里有不是0或1的数字,就不是二进制代码,就是假代码了
while(m*8<strlen(a))
{
//接下来是对各种情况的判定
if(a[m*8]=='1')
{
if(a[m*8+1]=='1'&&a[m*8+2]=='1')
{
b[t]=' ';
}
else if(a[m*8+1]=='0'&&a[m*8+2]=='1')
{
n=(a[m*8+3]-'0')*s[4]+(a[m*8+4]-'0')*s[3]+(a[m*8+5]-'0')*s[2]+(a[m*8+6]-'0')*s[1]+a[m*8+7]-'0';
if(n<26)
b[t]=n+'A';
else//如果n>=26那就不是字母了
{
cout<<"Error";
return 0;
}
}
else
{
cout<<"Error";
return 0;
}
}
else if(a[m*8]=='0')
{
if(a[m*8+8]=='0')//数字单元必须是两个连在一起的
{
//这里需要注意,数字单元除了第一个数字,其他七位都是二进制数
n=((a[m*8+1]-'0')*s[6]+(a[m*8+2]-'0')*s[5]+(a[m*8+3]-'0')*s[4]+(a[m*8+4]-'0')*s[3]+(a[m*8+5]-'0')*s[2]+(a[m*8+6]-'0')*s[1]+a[m*8+7]-'0')/2;
m++;
n+=((a[m*8+1]-'0')*s[6]+(a[m*8+2]-'0')*s[5]+(a[m*8+3]-'0')*s[4]+(a[m*8+4]-'0')*s[3]+(a[m*8+5]-'0')*s[2]+(a[m*8+6]-'0')*s[1]+a[m*8+7]-'0')/2;
if(n/100==0)//很暴力的位数判定,因为最大的数也不会超过三位,我就懒得循环了
{
if(n/10==0)
{
b[t]=n+'0';
}
else
{
b[t]=n/10+'0';
t++;//第二个数字直接存储到下一位
b[t]=n%10+'0';
}
}
else
{
b[t]=n/100+'0';
t++;
b[t]=n/10%10+'0';
t++;
b[t]=n%10+'0';
}
}
else
{
cout<<"Error";
return 0;
}
}
else
{
cout<<"Error";
return 0;
}
m++;
t++;
}
cout<<b;
return 0;
}