Матч 147, Шифр Цезаря (CCipher)

Дивизион 2, Уровень 1

 

Шифр Цезаря состоит в том, что каждая его буква заменяется буквой, циклически сдвинутой на фиксированное число позиций. Например, если сдвигать буквы на две позиции, то ‘A’ перейдет в ‘C’, ‘B’ перейдет в ‘D’, а ‘Y’ – в ‘A’. Имеется закодированный текст. Необходимо восстановить первоначальный.

 

Класс: CCipher

Метод: string decode(string cipherText, int shift)

Ограничения: cipherText содержит от 0 до 50 символов латинского алфавита верхнего регистра ‘A’-‘Z’, 0 £ shift £ 25.

 

Вход. Закодированный текст cipherText и величина сдвига shift при кодировании.

 

Выход. Исходный (декодированный) текст.

 

Пример входа

cipherText

shift

VQREQFGT

2

“ABCDEFGHIJKLMNOPQRSTUVWXYZ”

10

“TOPCODER”

0

 

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

TOPCODER

QRSTUVWXYZABCDEFGHIJKLMNOP

TOPCODER

 

 

РЕШЕНИЕ

обработка массивов

 

Сдвигая каждую букву строки cipherText на shift символов влево, следует следить чтобы ASCII код полученного символа не вышел за рамки латинских букв верхнего регистра. Если это произойдет, то следует добавить к полученному коду символа 26.

 

ПРОГРАММА

 

#include <cstdio>

#include <string>

using namespace std;

 

class CCipher

{

public:

  string decode(string cipherText, int shift)

  {

    for(int i = 0; i < cipherText.size(); i++)

      if ((cipherText[i] -= shift) < 'A') cipherText[i] += 26;

    return cipherText;

  }

};