观察磁带可知,磁带的输入以“___________”开始和结束,其中的行数与输出的字符串长度(包括换行符)相等,都为43;
由此可对比磁带输入的每一行与与之对应的输出字符,如下:
___________ ASCII值
| o . o|1 A 65
| o . |2 32
| ooo . o|3 q 113
| ooo .o o|4 u 117
| oo o. o|5 i 105
| oo . oo|6 c 99
| oo o. oo|7 k 107
| o . |8 32
| oo . o |9 b
| ooo . o |10 r
| oo o.ooo|11 o
| ooo .ooo|12 w
| oo o.oo |13 n
| o . |14
| oo .oo |15 f
| oo o.ooo|16 o
| oooo. |17 x
| o . |18
| oo o. o |19 j
| ooo .o o|20 u
| oo o.o o|21 m
| ooo . |22 p
| ooo . oo|23 s
| o . |24
| oo o.ooo|25 o
| ooo .oo |26 v
| oo .o o|27 e
| ooo . o |28 r
| o . |29
| ooo .o |30 t
| oo o. |31 h
| oo .o o|32 e
| o . |33
| oo o.o |34 l
| oo . o|35 a
| oooo. o |36 z
| oooo. o|37 y
| o . |38
| oo .o |39 d
| oo o.ooo|40 o
| oo .ooo|41 g
| o o.oo |42 .
| o. o |43 \n
可得出一下规律:
将字符‘o’视为二进制数的1,空格视为二进制数的0,'A'的ASCII值为65,则其对应的磁带行的中间7个字符可进行二进制编码(忽略字符‘.’),为1000001,转换成十进制恰好是65
AC代码如下:
#include<stdio.h>
#include<string.h>
#include<math.h>
const int MAX=1000000+10;
char decode[MAX];
int main()
{
char tap[20];
int t=0,k=0;
while(1){
gets(tap);
if(strcmp(tap,"___________")==0){
++t;
if(t==2) break;
}
else{
int sum=0,j=0;
for(int i=9;i>=2;--i){
if(tap[i]=='o'){
int a=1;
for(int x=1;x<=j;++x) a*=2;
sum+=a;
}
if(tap[i]!='.')
j++;
}
decode[k]=sum; k++;
}
}
printf("%s",decode);
return 0;
}
--------------------------------------------------------------------------------------------
Keep It Simple,Stupid!
--------------------------------------------------------------------------------------------