0

ここで私が間違っていることを誰かが見ることができますか? 文字列を配列に沿って 14 スペース移動することで暗号化するアルゴリズムがありますが、解読しようとすると、暗号化されている場合などに一部の文字が繰り返され
ます

char[] plaintext = input.toCharArray();

for(int i = 0; i<plaintext.length; i++) {
    for(int j = 0 ; j<26; j++) {
        if(j>=14 && plaintext[i]==alphabet[j]) {
            plaintext[i] = alphabet[j-14];
            break;
        }

        else if(plaintext[i] == alphabet[j] && j<14 ) {
            plaintext[i] = alphabet [j+14] ;
        }
    }
}
4

1 に答える 1

1

問題は、文字が>= 14またはの場合に適用する操作が同じではないという事実に< 14あり、境界を超える可能性があるため、これも間違っています。

あなたがすることは次のとおりです。

  • 18 (>= 14) -> 18 - 14 = 4しかし18 + 14 = 32 = 26+6、そして6 != 4
  • 13 (<14) -> 13 + 14 = 27これは範囲外です。

このアプローチは正しくありません。値をアルファベット配列にラップする必要があります。これはmod %演算子で簡単に実行できます。

newIndex = (oldIndex+shift) % alphabetLength

適切なツールを使用しないと、すべての単純なタスクでエラーが発生しやすくなり、保守が困難になります。モジュロなしで行うこともできますが、計算は正しいはず14です。アルファベットのインデックスに加算および減算しても、有効なマッピングは確実に作成されません。

于 2013-05-06T19:52:08.983 に答える