UVaoj 213:デコードプログラム

1636 ワード

トランスポートゲート:タイトルリンク
考え方:サイクルを作り、各サイクルには3つのステップが含まれています.
第一歩は、自分で書いたmy_getline取得ファイルの1行ヘッダー(なぜ自分で書くのですか?連絡CでC++を使いたくないしgetsが安全ではないしスペースが入力されているなど)は、1行の文字列を取得する終了時に対応するアドレスの末尾に'0'を終端として付けることに注意してください.取得を終了したフラグはEOF,'\rの3つである.
第2ステップでは,headerとバイナリ数(msg)の関係を処理する.ここではバイナリとそのテーマ自体の特徴を利用して,長さlenで重みをつけようとする.だからtable[len][max_value]表現(len,value)を作って、対応するヘッダーの文字を保存します.
ステップ3でmsgを読み出します.入力の任意性(行随意)から,読みながら操作しながら出力しなければならないと考えられる.したがって、ステップに従って、msgの最初のnum個数を読み出し、その10進数値を返す関数readint(num)を作成します.これにより、readint(3)で次の符号化長(lenとして保存)を取得し、その値が2^len-1になるまでreadint(len)をジャンプし続けるループが作成され、readint(3)が0になると今回のループが終了することを意味する.ただし、末尾に改行がある可能性があります!だからgetchar()で取得すると、EOF(最外周のループ終了)か改行文字が得られます.
#include
//#include
//#include

char header[6666];
char table[8][(1<<7)];//(len, value) -> char_in_header

int my_getline(char *header){
	//get the line of the stdin, terminated by '
' or '\r' or EOF; return the length of the string int temp; int i = 0; while(EOF != (temp = getchar())){ if(temp !='
' && temp != '\r'){ *(header + i) = (char)temp; i++; } else break; } //attention: put '\0' at the end *(header + i) = '\0'; if(temp == EOF) return EOF; else return i; } int readbit(int num){ //read num bits(0 or 1) from stdin, return the decimal value char temp; int ans = 0; int times = 0; while(times < num && (temp = getchar())){ if(temp != '\r' && temp != '
'){ times++; ans += (temp - '0') * (1<