Задача
Юлий Цезарь использовал свой способ шифрования текста. Каждая буква заменялась на следующую по алфавиту через $k$ позиций по кругу. Необходимо по заданной шифровке определить исходный текст.
Входные данные
В первой строке дана шифровка, состоящая из не более чем $255$ заглавных латинских букв. Во второй строке число $k \left ( 1 \leq k \leq 10 \right ).$
Выходные данные
Вывести результат расшифровки.
Тесты
Входные данные | Выходные данные |
$XPSE \\ 1$ | $WORD$ |
$ZABC \\ 3$ | $WXYZ$ |
$WURYAD \\ 4$ | $SQNUWZ$ |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); String str = in.nextLine(); char[] s = str.toCharArray(); int ABC_SIZE = 26; // Количество символов латинского алфавита int k = in.nextInt(); String str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char[] s1 = str1.toCharArray(); for(int i = 0; i < s.length; i++){ int find = s[i] - 'A'; if(find - k < 0) s[i] = s1[ABC_SIZE - (k - find)]; else s[i] = s1[find-k]; } System.out.println(s); } } |
Решение
Для решения задачи вводим строки $str$ и $str1$ и преобразуем их в массив символов $(char)$. Чтобы расшифровать слово, находящееся в строке
$s$, необходимо заменить каждую букву данной строки на букву, находящуюся на $(find — k)$ позиции строки $s1$, где $s1$ — строка, содержащая латинский алфавит, а $find$ — позиция заменяемой буквы в алфавите. В случае если разница $find$ и $k$ меньше нуля, заменяем букву строки $s$ на букву, находящуюся на $(26 — (k — find))$ позиции строки $s1$, то есть, не считая то количество позиций, которые уже были пройдены от изначального символа до первого символа строки $s1$. Можно не беспокоиться о том, что символ вернется к концу алфавита более, чем один раз так как условие исключает этот вариант ($ k \leq 10$ при 26-ти символах латинского алфавита).
Ссылки
Условие задачи на e-olymp
Код решения задачи ideone