Java凯撒移位

Java Caesar Shift

我一直在尝试在 Java 中编写一个简单的凯撒移位,假设用户只会输入没有空格的大写字母。 A变成Z,B变成Y等等。我需要自己学习如何做到这一点,所以请不要只为我写代码,只需将我推向正确的方向即可。这是我认为导致问题的部分代码。

System.out.print("Please enter you word: ");
        String code = in.nextLine();
        for (int i=0; i < code.length(); i++){
            System.out.print ((char)(code.charAt(i)+'A'+26) %26 );

要使用 % 26,您必须确保您的数据在 0..25 区间内。 A 必须为 0,Z 必须为 25。想象一下,第一个字符是 B。您正在做的是 (B+A+26)%26 - 这毫无意义。

使其正确

  1. 想想如何从 A 中得到 0,从 B 中得到 1 等等
  2. 想想如何将 0 移位到 25、1 到 0、2 到 1 等等
  3. 思考如何从 0 制作 A,从 1 制作 B

我不确定 A to Z, B to C 是否对应于凯撒大转移?

让我们以Wikipedia为例,左移3位,或者相当于右移23位:

Plain:    ABCDEFGHIJKLMNOPQRSTUVWXYZ
Cipher:   XYZABCDEFGHIJKLMNOPQRSTUVW

为了得到密码字符的位置,我们将右移 23 添加到明文字符的位置。这对 A,B,C 没问题,但是当我们到达 D 时,我们已经超出了字母表的末尾。要解决这个问题,我们需要 "wraparound" 到开头,这样做的技术是使用模数 (%) 运算符,模数等于元素的数量,在本例中为 26。你说你只是想要一个推动,所以希望这就足够了,但不要太多,信息。

还有一点。你说你的代码为 'A' 输出 0,为 'B' 输出 1 等。使用 'A' 作为输入,你的代码等效于:

 System.out.print ((char)('A'+'A'+26) % 26) 

'A' 的整数值为 65,因此这相当于:

System.out.print ((char)(65+65+26) % 26)

您正在将 (65+65+26) 转换为 char,但是 % 运算符和 int 操作数 (26) 会生成 int,所以你实际上是在打印:

System.out.print (0)

一旦你计算出正确的凯撒变换 expression,你需要在打印时将结果转换回 (char),如:

System.out.print ((char)(expression))

否则你会得到表达式的 int 值。