有谁能看到我在这里做错了什么?我有一个算法,通过沿着一个数组移动它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] ;
}
}
}
答案 0 :(得分: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
肯定不会创建有效的映射。