0

谁能看到我在这里做错了什么?我有一个算法,通过将字符串沿数组移动 14 个空格来加密字符串,但是当我尝试解密它时,一些字母会重复,例如
加密时:abcdefghijklmnopqrstuvwxyz == opqrstuvwxyzabcdefghijklmn
解密时:opqrstuvwxyzabcdefghijklmn == abcdefghijklklabcdefghijkl

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

问题在于,当字符是>= 14or时,你应用的操作是不一样的< 14,而且它也是错误的,因为它可能会越界。

你要做的是:

  • 18 (>= 14) -> 18 - 14 = 4但是18 + 14 = 32 = 26+66 != 4
  • 13 (<14) -> 13 + 14 = 27这是超出范围的。

该方法不正确,您应该将值包裹在字母数组上,这可以使用mod %运算符轻松完成:

newIndex = (oldIndex+shift) % alphabetLength

如果不使用适当的工具,每一项简单的任务都容易出错且难以维护。您也可以不使用模数,但计算应该是正确的,添加和减去14字母索引肯定不会创建有效的映射。

于 2013-05-06T19:52:08.983 回答