Юлий Цезарь использовал свой метод
шифрования текста. Каждая буква заменялась на букву, расположенную в алфавите
на 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)