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;
  }
}              //可以讀入換行輸入的數據 

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

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數組中。code【編碼長度len】【此長度內對應的編碼位置value】 
//printcodes();                        //顯示其可以幫助理解! 
    for(;;) {
      int len = readint(3);             //讀入前3個數,獲取長度len 
      if(len == 0) break;
//printf("len=%d\n", len);
      for(;;) {
        int v = readint(len);            //繼續讀入長度為len的數,獲取該編碼的位置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)這個二元數組來表示一個編碼,其中len表示編碼長度,value是編碼對應的十進制值
    ②之后用codes[len][value]保存這個編碼所對應的字符,這里需要需要注意我們是這里是單個字符輸入的,而且我們編譯頭是獨自一行的。我們這里為什么不考慮,getline因為我們需要每個字符輸入和len有直接聯系的,所以我們選擇單個輸入。
    ③處理比編碼文本可以由多行組成這個問題,筆者編寫了一個跨行編寫讀字符的代碼
    ④進制轉化問題了,二進制中8位最大的整數是2^8 - 1 用C寫是(1 << 8)-1
    ⑤10進制轉化為X進制
while(n != 0)
{
num[i] = n % x;
i++;
n = n/x;
}

X進制轉為10進制

 for(int i = 0;i < length; i++)
 {
 ans = ans * X + num[i];
 }
  • 過程
  • 讀入編碼頭到 表code[len][value]中
  • 讀入三個二進制數獲取長度
  • 向后繼續讀入,獲取對應長度的對應第幾位置
  • 查表code[len][value]
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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