1. 程式人生 > 其它 >P3982 龍盤雪峰資訊解析器題解

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