- Регистрация
- 21 Фев 2017
- Сообщения
- 219
- Реакции
- 74
- Баллы
- 3

Шифр Цезаря один из наиболее древнейших известных шифров. Схема шифрования очень про- ста - используется сдвиг буквы алфавита на фиксированное число позиций влево. Например, если сдвиг равен трем, то буква A заменяется на D, а буква z - на c. Вам дана зашифрованная строка s, состоящая только из латинских букв и пробелов и число K, на которое были сдвинуты буквы алфавита при шифровании.
Формат входных данных: В первой строке записано одно целое число K (|K| ⩽ 105). Во второй строке записана одна строка s, состоящая только из больших и маленьких латинских букв и пробелов. Длина строки не превосходит 106.
Формат выходных данных: Выведите с учетом регистра расшифрованную строку.
Стандартный ввод:
- 15 - Xi xh ktgn wpgs egdqatb
- 12 - Eaxhq Uf Iuft Rudq
- 3 - Yhql ylgl ylfl Veni vidi vici
Код:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
int k = int.Parse(Console.ReadLine()); // Смещение влево на k букв
string s = Console.ReadLine(); // Входная строка
string rez = ""; // Итог
char min_A = (char)65; // Граница символов от A до Z
char max_Z = (char)90;
char min_a = (char)97; // Граница символов от a до z
char max_z = (char)122;
List<char> simb = new List<char> { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '-', '!', '?', ':', ';', '@',
'#', '$', '%', '^', '&', '*', '(', ')', '_','"', '№', '_', '-', '+', '=', '<', '>', '\\', '/', '|', '~', '`', ' '};
// Список знаков, которые нельзя изменять
if (Math.Abs(k) <= Math.Pow(10, 5)) // Проверка условия задачи на |k|<=10^5
for (int i = 0; i < s.Length; i++) // Сравниваем каждый символ строки
{
if (simb.Contains(s[i])) // Если символ из строки есть в списке, то просто добавляем его
rez += s[i];
else
{
if (s[i] >= min_A && s[i] <= max_Z) // Если буква заглваная
{
if ((int)(s[i] - k) < min_A) // Если смещение выходит за границы A..Z
{
rez += (char)(max_Z - (k - ((int)s[i] - min_A + 1)));
}
else rez += (char)(int)((s[i]) - k); // Если нет, то добавляем заглавную букву
}
if (s[i] >= min_a && s[i] <= max_z) // Если буква строчная
{
if ((int)(s[i] - k) < min_a) // Если смещение выходит за границы a..z
{
rez += (char)(max_z - (k - ((int)s[i] - min_a + 1)));
}
else rez += (char)(int)((s[i]) - k); // Если нет, то добавляем строчную букву
}
}
}
Console.WriteLine(rez);
Console.ReadKey();
}
}