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
- 这毫无意义。
使其正确
- 想想如何从
A
中得到 0,从 B
中得到 1 等等
- 想想如何将 0 移位到 25、1 到 0、2 到 1 等等
- 思考如何从 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
值。
我一直在尝试在 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
- 这毫无意义。
使其正确
- 想想如何从
A
中得到 0,从B
中得到 1 等等 - 想想如何将 0 移位到 25、1 到 0、2 到 1 等等
- 思考如何从 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
值。