# e910: 108 p10. 解碼問題
題目連結:[e910](https://zerojudge.tw/ShowProblem?problemid=e910)
這個我認為就是單純的難題
單純要測試輸入、判別的難題
尤其題目給定的代碼都與ASCII碼沒有關係
所以我用分類的方式減少判斷的難度
首先用長度的方式分類
長度決定呼叫的判斷函式
其中main以外函式皆為判斷的函式
以下為程式碼:
```c=
#include<stdio.h>
#include<string.h>
char c[1000000];
char check2(char a[100]){
char ch0[1]={' '};
char code0[3]={"00"};
if(strcmp(a,code0)==0){
return ch0[0];
}else{
return '=';
}
}
char check4(char a[100]){
int i;
char codea[5] = {"1000"};
char codee[7] = {"1111"};
char codei[7] = {"0110"};
char coden[7] = {"0111"};
char codeo[7] = {"1001"};
char codet[7] = {"1100"};
char symb4[6] = {'A',
'E',
'I',
'N',
'O',
'T'};
if(strcmp(a,codea)==0){
return symb4[0];
}else if(strcmp(a,codee)==0){
return symb4[1];
}else if(strcmp(a,codei)==0){
return symb4[2];
}else if(strcmp(a,coden)==0){
return symb4[3];
}else if(strcmp(a,codeo)==0){
return symb4[4];
}else if(strcmp(a,codet)==0){
return symb4[5];
}else{
return '=';
}
}
char check5(char a[100]){
char codec[6]={"10110"};
char coded[6]={"11010"};
char codef[6]={"01010"};
char codeh[6]={"10101"};
char codel[6]={"10100"};
char codem[6]={"01000"};
char coder[6]={"11100"};
char codes[6]={"11101"};
char symb5[8] = {'C',
'D',
'F',
'H',
'L',
'M',
'R',
'S'};
if(strcmp(a,codec)==0){
return symb5[0];
}else if(strcmp(a,coded)==0){
return symb5[1];
}else if(strcmp(a,codef)==0){
return symb5[2];
}else if(strcmp(a,codeh)==0){
return symb5[3];
}else if(strcmp(a,codel)==0){
return symb5[4];
}else if(strcmp(a,codem)==0){
return symb5[5];
}else if(strcmp(a,coder)==0){
return symb5[6];
}else if(strcmp(a,codes)==0){
return symb5[7];
}else{
return '=';
}
}
char check6(char a[100]){
char codedot[7]={"010010"};
char codeb[7]={"110110"};
char codeg[7]={"010110"};
char codep[7]={"010011"};
char codeu[7]={"101111"};
char codey[7]={"101110"};
char symb6[6] = {'.',
'B',
'G',
'P',
'U',
'Y'};
if(strcmp(a,codedot)==0){
return symb6[0];
}else if(strcmp(a,codeb)==0){
return symb6[1];
}else if(strcmp(a,codeg)==0){
return symb6[2];
}else if(strcmp(a,codep)==0){
return symb6[3];
}else if(strcmp(a,codeu)==0){
return symb6[4];
}else if(strcmp(a,codey)==0){
return symb6[5];
}else{
return '=';
}
}
char check7(char a[100]){
char codew[8] = {"1101110"};
char symb7[1] = {'W'};
if(strcmp(a,codew)==0){
return symb7[0];
}else{
return '=';
}
}
char check8(char a[100]){
char codepe[9]={"01011110"};
char codev[9]={"11011111"};
char symb8[2] = {',',
'V'};
if(strcmp(a,codepe)==0){
return symb8[0];
}else if(strcmp(a,codev)==0){
return symb8[1];
}else{
return '=';
}
}
char check9(char a[100]){
char code0[10]={"010111011"};
char code1[10]={"110111100"};
char code2[10]={"010111000"};
char codek[10]={"010111111"};
char codeq[10]={"010111001"};
char symb9[5] = {'0',
'1',
'2',
'K',
'Q'};
if(strcmp(a,code0)==0){
return symb9[0];
}else if(strcmp(a,code1)==0){
return symb9[1];
}else if(strcmp(a,code2)==0){
return symb9[2];
}else if(strcmp(a,codek)==0){
return symb9[3];
}else if(strcmp(a,codeq)==0){
return symb9[4];
}else{
return '=';
}
}
char check10(char a[100]){
char code5[11]={"0101110101"};
char codex[11]={"0101111101"};
char symb10[2] = {'5',
'X'};
if(strcmp(a,code5)==0){
return symb10[0];
}else if(strcmp(a,codex)==0){
return symb10[1];
}else{
return '=';
}
}
char check11(char a[100]){
char codesup[12]={"01011101000"};
char code3[12]={"11011110111"};
char code6[12]={"11011110100"};
char code7[12]={"01011101001"};
char code8[12]={"11011110101"};
char codej[12]={"01011111000"};
char codez[12]={"11011110110"};
char symb11[7] = {'!',
'3',
'6',
'7',
'8',
'J',
'Z'};
if(strcmp(a,codesup)==0){
return symb11[0];
}else if(strcmp(a,code3)==0){
return symb11[1];
}else if(strcmp(a,code6)==0){
return symb11[2];
}else if(strcmp(a,code7)==0){
return symb11[3];
}else if(strcmp(a,code8)==0){
return symb11[4];
}else if(strcmp(a,codej)==0){
return symb11[5];
}else if(strcmp(a,codez)==0){
return symb11[6];
}else{
return '=';
}
return '=';
}
char check12(char a[100]){
char code4[13] = {"010111110011"};
char symb12[1] = {'4'};
if(strcmp(a,code4)==0){
return symb12[0];
}else{
return '=';
}
}
char check13(char a[100]){
char codequ[14]={"0101111100100"};
char code9[14]={"0101111100101"};
char symb13[2] = {'?',
'9'};
if(strcmp(a,codequ)==0){
return symb13[0];
}else if(strcmp(a,code9)==0){
return symb13[1];
}
return '=';
}
int main(){
while(scanf("%s",c)!=EOF){
char code[100000];
int n=0;
int l=strlen(c),i,j;
for(i=0;i<l;i++){
char temp[20]={'6'};
for(j=0;j<2;j++){ //2
temp[j]=c[i+j];
}
if(check2(temp)!='='){
code[n]=check2(temp);
n+=1;
i=i+1;
//printf("i= %d\n",i);
continue;
}
for(j=0;j<4;j++){ //4
temp[j]=c[i+j];
}
if(check4(temp)!='='){
code[n]=check4(temp);
n+=1;
i=i+3;
//printf("i= %d\n",i);
continue;
}
for(j=0;j<5;j++){ //5
temp[j]=c[i+j];
}
if(check5(temp)!='='){
code[n]=check5(temp);
n+=1;
i=i+4;
//printf("i= %d\n",i);
continue;
}
for(j=0;j<6;j++){ //6
temp[j]=c[i+j];
}
if(check6(temp)!='='){
code[n]=check6(temp);
n+=1;
i=i+5;
//printf("i= %d\n",i);
continue;
}
for(j=0;j<7;j++){ //7
temp[j]=c[i+j];
}
if(check7(temp)!='='){
code[n]=check7(temp);
n+=1;
i=i+6;
//printf("i= %d\n",i);
continue;
}
for(j=0;j<8;j++){ //8
temp[j]=c[i+j];
}
if(check8(temp)!='='){
code[n]=check8(temp);
n+=1;
i=i+7;
//printf("i= %d\n",i);
continue;
}
for(j=0;j<9;j++){ //9
temp[j]=c[i+j];
}
if(check9(temp)!='='){
code[n]=check9(temp);
n+=1;
i=i+8;
//printf("i= %d\n",i);
continue;
}
for(j=0;j<10;j++){ //10
temp[j]=c[i+j];
}
if(check10(temp)!='='){
code[n]=check10(temp);
n+=1;
i=i+9;
//printf("i= %d\n",i);
continue;
}
for(j=0;j<11;j++){ //11
temp[j]=c[i+j];
}
if(check11(temp)!='='){
code[n]=check11(temp);
n+=1;
i=i+10;
//printf("i= %d\n",i);
continue;
}
for(j=0;j<12;j++){ //12
temp[j]=c[i+j];
}
if(check12(temp)!='='){
code[n]=check12(temp);
n+=1;
i=i+11;
//printf("i= %d\n",i);
continue;
}
for(j=0;j<13;j++){ //13
temp[j]=c[i+j];
}
if(check13(temp)!='='){
code[n]=check13(temp);
n+=1;
i=i+12;
//printf("i= %d\n",i);
continue;
}
memset(temp,'\0',20);
}
for(i=0;i<n;i++){
printf("%c",code[i]);
}
printf("\n");
}
return 0;
}
```
例如字元長度2的只有 '0'
所以就建立一個判斷長度2函式:
```c=
char check2(char a[100]){
char ch0[1]={' '};
char code0[3]={"00"};
if(strcmp(a,code0)==0){
return ch0[0];
}else{
return '=';
}
}
```
不過當然,這個程式碼還可以再優化