密码加密的基本算法无法按预期的字母数组工作

时间:2018-10-26 07:58:15

标签: java arrays

因此,对于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];
                    }
                }
            }
        }

2 个答案:

答案 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循环中。 谢谢你们的帮助!