UVa213 信息解碼 例題4-4(P83)

題目地址


// uva 213 
// 2017.1.25 
#include<stdio.h>
#include<string.h>

int readchar() {
  for(;;) {
    int ch = getchar();
    if(ch != '\n' && ch != '\r') return ch;
  }
}              //可以讀入換行輸入的數(shù)據(jù) 

int readint(int c) {
  int v = 0;
  while(c--) v = v * 2 + readchar() - '0';
  return v;
}              //讀入長度為len的二進制的字符串,同時返回對應(yīng)十進制值 

int code[8][1<<8];

int readcodes() {
  memset(code, 0, sizeof(code));
  code[1][0] = readchar();
  for(int len = 2; len <= 7; len++) {
    for(int i = 0; i < (1<<len)-1; i++) {
      int ch = getchar();
      if(ch == EOF) return 0;
      if(ch == '\n' || ch == '\r') return 1;
      code[len][i] = ch;
    }
  }
  return 1;
}

//讀入編碼頭,一串字符 
void printcodes() {
  for(int len = 1; len <= 7; len++)
    for(int i = 0; i < (1<<len)-1; i++) {
      if(code[len][i] == 0) return;
      printf("code[%d][%d] = %c\n", len, i, code[len][i]);
    }
}

int main() {
  while(readcodes()) {                    //讀入編碼頭到code數(shù)組中。code【編碼長度len】【此長度內(nèi)對應(yīng)的編碼位置value】 
//printcodes();                        //顯示其可以幫助理解! 
    for(;;) {
      int len = readint(3);             //讀入前3個數(shù),獲取長度len 
      if(len == 0) break;
//printf("len=%d\n", len);
      for(;;) {
        int v = readint(len);            //繼續(xù)讀入長度為len的數(shù),獲取該編碼的位置value 
//printf("v=%d\n", v);
        if(v == (1 << len)-1) break;
        putchar(code[len][v]);            //查code表并且輸出 
      }
    }
    putchar('\n');
  }
  return 0;
}


/*
01串序列
二進制:0,00,01,10,000,001,010,011,100,101,110,0000,0001,……
len:    1, 2 , 2 , 2 , 3 , 3  , 3  , 3  , 3  , 3  , 3  , 4  , 4     …… 
value:  0,0 ,1 ,2 , 0 ,1  ,2  ,3  , 4  ,5  ,6  ,0  ,1     ……
例子    $  #   *   *   \ 
*/

Input:

$#**\
0100000101101100011100101000

Output:

##*\$
  • 注意
    題目分析:
    ①這道題主要考察二進制的東西,有了二進制,我們就不必以字符串的形式保存這一大串編碼了,我們只需要把編碼理解成二進制,用(len, value)這個二元數(shù)組來表示一個編碼,其中l(wèi)en表示編碼長度,value是編碼對應(yīng)的十進制值
    ②之后用codes[len][value]保存這個編碼所對應(yīng)的字符,這里需要需要注意我們是這里是單個字符輸入的,而且我們編譯頭是獨自一行的。我們這里為什么不考慮,getline因為我們需要每個字符輸入和len有直接聯(lián)系的,所以我們選擇單個輸入。
    ③處理比編碼文本可以由多行組成這個問題,筆者編寫了一個跨行編寫讀字符的代碼
    ④進制轉(zhuǎn)化問題了,二進制中8位最大的整數(shù)是2^8 - 1 用C寫是(1 << 8)-1
    ⑤10進制轉(zhuǎn)化為X進制
while(n != 0)
{
num[i] = n % x;
i++;
n = n/x;
}

X進制轉(zhuǎn)為10進制

 for(int i = 0;i < length; i++)
 {
 ans = ans * X + num[i];
 }
  • 過程
  • 讀入編碼頭到 表code[len][value]中
  • 讀入三個二進制數(shù)獲取長度
  • 向后繼續(xù)讀入,獲取對應(yīng)長度的對應(yīng)第幾位置
  • 查表code[len][value]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,927評論 0 33
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,741評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,648評論 19 139
  • 文/甜點 1 “我已經(jīng)原諒了從前的自己,就像諒解了一個野心勃勃的傻逼,體恤了一個...
    思甜_根號2閱讀 744評論 0 4
  • 一、 數(shù)組排序 Array.sort原理:首先,js中的sort會將排序的元素類型轉(zhuǎn)化成字符串進行排序。不過它是一...
    Promise__閱讀 3,584評論 0 1

友情鏈接更多精彩內(nèi)容