P3982 龙盘雪峰信息解析器题解
首先审题:
-
若前三个字符为 “101” ,则转换为字母;
-
若前三个字符为 “111” ,则输出空格;
-
若第一个字符为 ‘0’,则转换为数字;
-
否则输出 “Error”;
需要注意的是:
-
如果输入内容的总长度不是8的倍数,则需输出 “Error”;
-
如果输入的内容中有不是 ‘0’ 或 ‘1’ 的字符,输出 “Error”;
-
如果输入的内容中数字单元后未跟数字单元,也需输出 “Error”;
-
如果字母单元中的字符之和大于等于 26 ,输出 “Error”;
-
输出需在所有单元都判定完后再输出,否则输出中可能会在字母和数字后有 “Error”,导致 WA ;
代码+注释:
#include <bits/stdc++.h>
using namespace std;
char a[171115],ch,c[21390];// a 为输入内容,ch 为中转站,c 为输出内容
int l=1,n,t,x,y=0,z;// l 为输入内容的长度,n 为单元数,x、z 储存数字(详见 28 到 51 行),y为输出内容的长度
bool b=1,d=0;// b 判断输入内容是否正常,d 判断是否为连续的2个数字中的第一个
int main()
{
for (ch=getchar();ch!='\0' && ch!=EOF && ch!='\n';ch=getchar()) a[l++]=ch;//输入并得到长度 l
l--;
n=l/8;
if (l%8!=0) b=0;//如果 l 的长度不为 8 的倍数,则 b=0
else
{
for (int i=1;i<=l;i++)
{
if (a[i]!='1' && a[i]!='0')
{
b=0;
break;
}
}
if (b==1)
{
for (int i=1;i<=n;i++)
{
t=(i-1)*8;
if (a[t+1]=='1' && a[t+2]=='0' && a[t+3]=='1')//判断是否为大写字母
{
x=(a[t+4]-'0')*16+(a[t+5]-'0')*8+(a[t+6]-'0')*4+(a[t+7]-'0')*2+(a[t+8]-'0');
if (0<=x && x<26)//判断 x 是否在大写字母范围内(因为 'A' 为0,所以此处 x 的范围为 0<=x<26 )
{
y++;
c[y]=x+'A';
}
else b=0;
}
else if (a[t+1]=='1' && a[t+2]=='1' && a[t+3]=='1')//判断是否为空格
{
y++;
c[y]=' ';
}
else if (a[t+1]=='0')//判断是否为数字
{
x=(a[t+2]-'0')*64+(a[t+3]-'0')*32+(a[t+4]-'0')*16+(a[t+5]-'0')*8+(a[t+6]-'0')*4+(a[t+7]-'0')*2+(a[t+8]-'0');
x=x/2;
if (d==0)//判断是否为第一个数字,如果是,则存入z
{
z=x;
d=1;
}
else//如果不是,则相加
{
d=0;//重置 d
z=z+x;
if (z/100>0)//如果两数之和大于等于 100,按位储存
{
y++;
c[y]=z/100+'0';
y++;
c[y]=z/10%10+'0';
y++;
c[y]=z%10+'0';
}
else if (z/10%10>0)//如果两数之和小于 100 且大于大于等于 10,按位储存
{
y++;
c[y]=z/10+'0';
y++;
c[y]=z%10+'0';
}
else if (z/10==0)//如果两数之和小于 10,直接储存
{
y++;
c[y]=z+'0';
}
}
}
else b=0;//如果有异常内容,则 b=0
}
}
}
if (b==0 || d==1) cout<<"Error"<<endl;//如果 b=0 或只有一个单独的数字单元,则输出 "Error"
else//否则输出 c
{
for (int i=1;i<=y;i++)
cout<<c[i];
cout<<endl;
}
return 0;
}