2164. Шифр Юлия

 

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

 

Вход. В первой строке дана шифровка, состоящая из не более чем 255 заглавных латинских букв. Вторая строка содержит число k (1 k ≤ 10).

 

Выход. Вывести результат расшифровки.

 

Пример входа

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

XPSE

1

WORD

 

 

РЕШЕНИЕ

строки

 

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

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

Пусть s[i] – текущая буква шифра. Тогда номер буквы равен s[i] – ‘A’. Вычтем из нее число k по кругу (перед ‘A’ идет ‘Z’), получим (s[i] – ‘A’ – k + 26) % 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

 

#include <iostream>

#include <string>

using namespace std;

 

string s;

int i, k;

 

int main(void)

{

  cin >> s >> k;

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

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

  cout << s << endl;

  return 0;

}