Я не уверен, что A to Z, B to C
соответствует Цезарскому сдвигу, не так ли?
Давайте возьмем пример из Википедии , сдвиг влево на 3 места или, что эквивалентно, вправосмещение на 23 позиции:
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Cipher: XYZABCDEFGHIJKLMNOPQRSTUVW
Чтобы получить позицию зашифрованного символа, мы добавляем правый сдвиг 23
к позиции простого символа.Это нормально для A,B,C
, но к моменту достижения D
мы уже вышли за пределы алфавита.Чтобы исправить это, нам нужно «обернуть» начало, и техника для этого заключается в использовании оператора по модулю (%)
с модулем, равным количеству элементов, в данном случае 26. Вы сказали, что просто хотелитолкни, надеюсь, этого достаточно, но не слишком много информации.
Еще один момент.Вы говорите, что код выводит 0 для 'A'
, 1 для 'B'
и т. Д. При вводе '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
значение выражения.