UVa 213 Message Decoding情報復号
1809 ワード
復号プログラムを书いて、まず1つの符号化ヘッドを入力して、それから1列の01シーケンスを入力して、行をまたぐことができて、シーケンス内の各サブ列はすべて符号化ヘッドの1つの文字に対応します.
符号化長は1−7から3ビットの2進数で表し,000は符号化終了を表し,シーケンス中の全1の列は小節終了フラグである.
例えば、符号化ヘッダは$#*、符号化テキストは0100000101101001100101000であり、復号すべきである:010(符号化長2)00(#)00(#)10(*)11(小節終了)011(符号化長3)000()111(小節終了)001(符号化長1)0($)1(小節終了)000(符号化終了)
知識点:
1、シフト演算子:左シフト<>
左シフト:1<<3=00000001左シフト3ビット、低位補0、高位捨て、00001000=2^3、すなわち左シフト数ビットは2の数乗である.
右へ移動:2で割った数回のべき乗.
2、2次元配列で各符号化対応文字code[len][value]を表すことができ、lenは符号化長であり、valueは符号化対応の10進数の値であり、配列の内容は符号化ヘッダ文字に対応するASCII符号である.
3、getchar()とputchar()関数
getchar()関数:intタイプの値を返し、ユーザーに入力したASCIIコードとEOF.
putchar()関数:charタイプのデータが印刷され、パラメータはintタイプでもcharタイプでもよい.
この2つの関数の存在は,まずgetcharで符号化ヘッダを読み出してintタイプに変換し,int 2次元配列に格納できることを意味し,印刷時にもint配列に対応する符号化ヘッダ文字を見つけるだけでputcharで直接charタイプに変換して印刷する.
4、行をまたいで文字関数を読み、テーマに応じてgetcharを自分で利用して改造する.
''r'はすべて改行文字です.本題の符号化ヘッダの最初の文字はreadchar()で読み取る必要があります.2番目の符号化ヘッダを読み取るには、ストリームの残りの改行文字を先に読み出す必要があるからです.
5、バイナリ数を読み取り、10進数に変換します.
1101 = ((1*2+1)*2+0)*2+1 = 13
6、シフト演算子の優先度がプラスマイナス演算子より小さい
1<
符号化長は1−7から3ビットの2進数で表し,000は符号化終了を表し,シーケンス中の全1の列は小節終了フラグである.
例えば、符号化ヘッダは$#*、符号化テキストは0100000101101001100101000であり、復号すべきである:010(符号化長2)00(#)00(#)10(*)11(小節終了)011(符号化長3)000()111(小節終了)001(符号化長1)0($)1(小節終了)000(符号化終了)
知識点:
1、シフト演算子:左シフト<>
左シフト:1<<3=00000001左シフト3ビット、低位補0、高位捨て、00001000=2^3、すなわち左シフト数ビットは2の数乗である.
右へ移動:2で割った数回のべき乗.
2、2次元配列で各符号化対応文字code[len][value]を表すことができ、lenは符号化長であり、valueは符号化対応の10進数の値であり、配列の内容は符号化ヘッダ文字に対応するASCII符号である.
3、getchar()とputchar()関数
getchar()関数:intタイプの値を返し、ユーザーに入力したASCIIコードとEOF.
putchar()関数:charタイプのデータが印刷され、パラメータはintタイプでもcharタイプでもよい.
この2つの関数の存在は,まずgetcharで符号化ヘッダを読み出してintタイプに変換し,int 2次元配列に格納できることを意味し,印刷時にもint配列に対応する符号化ヘッダ文字を見つけるだけでputcharで直接charタイプに変換して印刷する.
4、行をまたいで文字関数を読み、テーマに応じてgetcharを自分で利用して改造する.
''r'はすべて改行文字です.本題の符号化ヘッダの最初の文字はreadchar()で読み取る必要があります.2番目の符号化ヘッダを読み取るには、ストリームの残りの改行文字を先に読み出す必要があるからです.
5、バイナリ数を読み取り、10進数に変換します.
1101 = ((1*2+1)*2+0)*2+1 = 13
6、シフト演算子の優先度がプラスマイナス演算子より小さい
1<
#include
#include
using namespace std;
int code[8][1 << 8];
/* */
int readchar()
{
for ( ;; )
{
int ch = getchar();
if ( ch != '
' && ch != '\r' ) return ch;
}
}
/* */
int readint(int x)
{
int v = 0;
while(x--)
{
v = v * 2 + readchar() - '0';
}
return v;
}
/* */
int readcode()
{
memset(code,0,sizeof(code));
code[1][0] = readchar();
for(int len = 2; len <= 7; len++)
{
for(int i = 0; i < (1<