Матч
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;
}
};