UVa:10878 - Decode the tape

观察磁带可知,磁带的输入以“___________”开始和结束,其中的行数与输出的字符串长度(包括换行符)相等,都为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!

--------------------------------------------------------------------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值