Java Caesar Shift

时间:2018-09-19 01:59:28

标签: java shift

我一直在尝试用Java编写一个简单的Caesar Shift,它假定用户将只输入不带空格的大写字母。 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 );

2 个答案:

答案 0 :(得分:3)

要使用% 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,等等

答案 1 :(得分:0)

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

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

Plain:    ABCDEFGHIJKLMNOPQRSTUVWXYZ
Cipher:   XYZABCDEFGHIJKLMNOPQRSTUVW

要获得密码字符的位置,我们在普通字符的位置加上右移23A,B,C很好,但是到D的时候,我们已经超越了字母的结尾。要解决此问题,我们需要从头开始“环绕”,执行此操作的技术是使用模数(%)运算符,其模数等于元素数,在这种情况下为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)会产生一个{{1} },因此您实际上是在打印:

int

一旦您为凯撒轮班制定了正确的System.out.print (0) ,则需要在打印时将结果投射回expression,如:

(char)

否则,您将获得表达式的System.out.print ((char)(expression)) 值。