P3982 龍盤雪峰資訊解析器題解
阿新 • • 發佈:2022-03-23
首先審題:
-
若前三個字元為 “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; }