SRM 147 DIV2 250
問題を読むための英単語
単語 | 意味 |
---|---|
Julius Caesar | シーザー(ローマ将軍) |
cryptography | 暗号法 |
further | さらに遠くに、さらに進んで |
問題概要
Input:暗号文、シフト数
Output:復号文
文字をアルファベット順である文字数分だけシフトする暗号がある。
例えば'A'が2シフトであれば、復号すると'C'となる。
暗号文とシフト数から復号文を出力せよ。
ただし、アルファベットの最後を超えるシフトは、'A'から開始する。
また、0シフトが要求された場合、入力文を復号文として出力する。
例示
"VQREQFGT"
2
Returns: "TOPCODER"
回答コード(C#)
class CCipher { public string decode( string cipherText, int shift) { string ret_text = ""; for (int i = 0; i < cipherText.Length; i++) { char c = cipherText [i]; int code = 0; code = (int)c - shift; if(code < 65){ code = 91 - (65 - code); } ret_text += ((char)code).ToString (); } return ret_text; } }
何か遠回り臭い
他の人のコードを参照
v[i] = (char)(((v[i] - 'A' + 26 - shift) % 26 ) + 'A' );
①v[i] - 'A'で0~26の間に移動する。
②+26 で26~52の間に移動する(-shiftでマイナスにならないように)
③-shift
④%26で、Aまでの距離を取得
⑤ASCII 'A'を足して回答を得る。
なるほど。
使いそうなコード
1.charをstring型に変換
char c = cipherText [i]
配列アクセスで良い
2.char型をint(ASCII)へ変換
int i = (int)c;
型キャストで良い
3.int型をchar型へ
char c = (char)i;
型キャストで良い
4.char型をstring型へ
string s = c.ToString();