我一直在尝试用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 );
答案 0 :(得分:3)
要使用% 26
,必须确保数据在0..25间隔内。 A
必须为0,Z
必须为25。想象一下,第一个字符为B
。您正在做的是(B+A+26)%26
-毫无意义。
使其正确
A
取0,从B
取1,等等A
,从1开始制作B
,等等答案 1 :(得分:0)
我不确定A to Z, B to C
是否对应于凯撒大帝?
让我们以Wikipedia为例,左移3位,或者右移23位:
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Cipher: XYZABCDEFGHIJKLMNOPQRSTUVW
要获得密码字符的位置,我们在普通字符的位置加上右移23
。 A,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))
值。