Uva 213 Message Decoding

紫書第四章例題
我用的基本上是紫書的方法:首先我們可以推出解碼序列和位數、其二進制形式數值的聯繫(找規律),就是x=(1<<weishu)-weishu-1+j;
然後寫一個readnum函數,用來讀入數據。

爲什麼要寫一個函數來讀入數據呢?因爲這道題,可能讀2位的數據,也有可能讀3位的數據。。。。寫一個函數,可以方便的利用getchar,使得程序結構簡化。

最後這道題的坑點在於字符的讀入,一定要處理無關字符!我用的是scanf(" ");

代碼:
#include<bits/stdc++.h>
using namespace std;
char key[3000];
int temp_input[100];
int readnum(int x)
{
    int ans=0,cns=1;
    for(int i=0;i<x;i++)
    {
        char temp=getchar();
        while((temp!='0')&&(temp!='1'))
            temp=getchar();
        temp_input[i]=temp-'0';

    }
    for(int i=x-1;i>=0;i--)
    {
        ans+=temp_input[i]*cns;
        cns<<=1;
    }
    return ans;
}
int main(void)
{
    //freopen("in.txt","r",stdin);
    int weishu,j,x;
    char ans;
    while(gets(key)!=NULL)
    {
        //printf("The key is %s\n",key);
        //printf("Step1\n");
        while(weishu=readnum(3))
        {
            //printf("Step2\n");
            while(true)
            {
                //printf("Step3\n");
                j=readnum(weishu);
                if((j+1)==(1<<weishu))
                {
                    break;
                }
                //printf("Step4\n");
                //printf("weishu=%d and j=%d\n",weishu,j);
                x=(1<<weishu)-weishu-1+j;
                //printf("x=%d\n",x);
                ans=key[x];
                printf("%c",ans);
            }
        }
        printf("\n");
        scanf(" ");
    }
    return 0;
}

發佈了104 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章