2164. Шифр Юлия

 

Юлий Цезарь использовал свой метод шифрования текста. Каждая буква заменялась на букву, расположенную в алфавите на k позиций вперед, при этом алфавит рассматривался как циклический.

По заданному зашифрованному тексту восстановите исходное сообщение.

 

Вход. Первая строка содержит зашифрованное сообщение, состоящее не более чем из 255 заглавных латинских букв.

Вторая строка содержит целое число k (1 ≤ k ≤ 10).

 

Выход. Выведите расшифрованный текст.

 

Пример входа

Пример выхода

XPSE

1

WORD

 

 

РЕШЕНИЕ

строки

 

Анализ алгоритма

Для расшифровки каждую букву следует сдвинуть на k позиций назад по кругу. Пронумеруем буквы от 0 (‘A’) до 25 (‘Z’).

Пусть s[i] – текущая буква шифра. Ее номер в алфавите вычисляется как s[i] – ‘A’. Чтобы выполнить сдвиг назад с учетом цикличности алфавита (перед ‘A’ идет ‘Z’), вычтем k и возьмем остаток по модулю 26. Затем прибавим ‘A’, чтобы получить ASCII-код расшифрованной буквы.

Таким образом, операция дешифрования выглядит следующим образом:

s[i] = (s[i] – ‘A’ – k + 26) % 26 + ‘A’

 

Реализация алгоритма

Входную строку сохраним в массиве символов s.

 

char s[1000];

 

Читаем входные данные.

 

gets(s); scanf("%d", &k);

 

Преобразуем символы строки в соответствии с правилом дешифрования.

 

for (i = 0; i < strlen(s); i++)

  s[i] = (((s[i] - 'A') + 26 - k) % 26) + 'A';

 

Выводим расшифрованный текст.

 

puts(s);

 

Реализация алгоритма – STL

Читаем входные данные.

 

cin >> s >> k;

 

Преобразуем символы строки в соответствии с правилом дешифрования.

 

for (i = 0; i < s.size(); i++)

  s[i] = (((s[i] - 'A') + 26 - k) % 26) + 'A';

 

Выводим расшифрованный текст.

 

cout << s << endl;

 

Python реализация

Читаем входные данные.

 

s = input()

k = int(input())

 

Преобразуем символы строки в соответствии с правилом дешифрования.

 

s = ''.join(chr(((ord(c) - ord('A') - k + 26) % 26) + ord('A'))

                for c in s)

 

Выводим расшифрованный текст.

 

print(s)