因此,对于Java中的密码,我有此算法。我有一个字母数组:
char[] alphabet = {'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y'};
还有一个用于存储字符的表(基于输入)。考虑到我已经检查了无数次,并且它完全按照预期存储了字符,所以这并不是那么重要。我在下面是一个代码,以便将字母数组中Y轴字母值上的每个字母向字母“轴”上的右边右移Y + 1次,如果超过25,则返回第一个值。意味着如果“ A”在Y = 0时,它将从字母轴上的值1更改为2,表示“ B”,而Y = 2处的“ X”会将24的值更改为27,并且因为如果超过25,则变成27-25 = 2,“ B”。为什么下面的代码为X = 0 Y = 0的字母“ A”输出“ Z”?
for(int p = 0; p < number; p++) {
for(int q = 0; q < number; q++) {
for(int r = 0; r < 26; r++) {
if(table[q][p] == alphabet[r]) {
table[q][p] = alphabet[(r+p+1)%26];
}
}
}
}
答案 0 :(得分:0)
当X = 0和Y = 0时,您添加的代码将为'A'产生字母'Z'。我假设[q]和[p]等于0
问题就在这里:
if(table[q][p] == alphabet[r]) {
table[q][p] = alphabet[(r+p+1)%26];
}
如果表[0] [0]保留“ A”值,则当r变量等于25时,此条件为true。因为在您的字母数组中,“ A”字母在索引25下。然后:
table[q][p] = alphabet[(r+p+1)%26];
因此表[0] [0]等于字母[(25 + 0 + 1)%26],而26%26为0。
table[q][p] = alphabet[0]
数组中的哪个是“ Z”字母。
更新:尝试以下操作:
Character[] alphabet = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
Character[][] table = {{'a', 'b'}, {'c', 'd'}, {'e', 'f'}};
for (int x = 0; x < table.length; x++) {
for (int y = 0; y < table[x].length; y++) {
int index = Arrays.asList(alphabet).indexOf(table[x][y]);
table[x][y] = alphabet[(index + y + 1) % 26];
}
}
答案 1 :(得分:0)
我现在才意识到我的问题。
该代码将起作用,并将“ A”更改为“ B”。但是它可以继续测试2到25之间的r值,该表槽是否等于下一个数字。当然可以。现在的字符“ B”等于字母数组的索引2,依此类推,直到最终结束,变成“ Z”。然后,我要做的就是将break;
添加到最后一个for
循环中。
谢谢你们的帮助!