P3982 龙盘雪峰信息解析器题解

首先审题:

  1. 若前三个字符为 “101” ,则转换为字母;

  2. 若前三个字符为 “111” ,则输出空格;

  3. 若第一个字符为 ‘0’,则转换为数字;

  4. 否则输出 “Error”;

需要注意的是:

  1. 如果输入内容的总长度不是8的倍数,则需输出 “Error”;

  2. 如果输入的内容中有不是 ‘0’ 或 ‘1’ 的字符,输出 “Error”;

  3. 如果输入的内容中数字单元后未跟数字单元,也需输出 “Error”;

  4. 如果字母单元中的字符之和大于等于 26 ,输出 “Error”;

  5. 输出需在所有单元都判定完后再输出,否则输出中可能会在字母和数字后有 “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;
}

如有不足请各位大佬指出,谢谢! Thanks♪(・ω・)ノ

这是萌新的第一篇题解,求过! qwq

posted @ 2022-03-23 20:34  Jason142  阅读(31)  评论(0编辑  收藏  举报