Редакция для Шифр Цезаря: шифрование
Submitting an official solution before solving the problem yourself is a bannable offence.
1. Идея
Нужно выполнить шифрование строки с помощью шифра Цезаря.
Шифр работает так:
- каждая заглавная латинская буква сдвигается на
kпозиций вперёд; - после
Zснова идётA; - все остальные символы остаются без изменений.
Значит, достаточно пройти по строке посимвольно и для каждого символа:
- если это буква от
AдоZ, заменить её на сдвинутую; - иначе оставить как есть.
2. Наблюдения
Наблюдение 1. Алфавит циклический
В латинском алфавите 26 заглавных букв.
Если при сдвиге выйти за Z, нужно продолжить с A.
Например, при k = 1:
A -> BY -> ZZ -> A
Для этого удобно использовать остаток от деления по модулю 26.
Наблюдение 2. Удобно перейти от буквы к номеру
Каждую букву можно представить как номер от 0 до 25:
A— это0B— это1- ...
Z— это25
Если символ c — заглавная буква, то её номер равен c - 'A'.
После сдвига новый номер будет:
(c - 'A' + k) % 26
Остаётся вернуть его обратно в букву:
'A' + новый_номер
Наблюдение 3. Пробелы и другие символы менять не нужно
По условию шифруются только заглавные латинские буквы.
Значит, если символ не находится в диапазоне от A до Z, его просто копируем в ответ без изменений.
3. Алгоритм
- Считать число
k. - Считать всю вторую строку целиком.
- Создать пустую строку ответа.
- Для каждого символа строки:
- если символ находится между
AиZ:- вычислить его позицию в алфавите;
- прибавить
k; - взять остаток по модулю
26; - превратить обратно в букву и добавить в ответ;
- иначе добавить символ в ответ без изменений.
- если символ находится между
- Вывести получившуюся строку.
4. Почему это работает
Рассмотрим любой символ входной строки.
Случай 1. Символ — заглавная латинская буква
Пусть это буква c.
Её позиция в алфавите равна c - 'A', то есть числу от 0 до 25.
По условию нужно сдвинуть букву на k позиций вперёд по циклическому алфавиту.
Именно это делает выражение:
(c - 'A' + k) % 26
- прибавление
kсдвигает букву; % 26обеспечивает переход отZобратно кA.
После этого прибавляем 'A' и получаем правильную новую букву.
Значит, каждая заглавная буква шифруется точно по правилу задачи.
Случай 2. Символ не является заглавной латинской буквой
По условию такие символы не должны меняться.
Алгоритм просто добавляет их в ответ без изменений.
Так как каждый символ обрабатывается по правилам задачи, вся итоговая строка получается корректно зашифрованной.
5. Сложность
Пусть длина строки равна n.
- Время работы:
O(n), потому что каждый символ обрабатывается один раз. - Дополнительная память:
O(n), так как строится строка ответа.
6. Код на C++17
#include <iostream>
#include <string>
using namespace std;
int main() {
int k;
cin >> k;
cin.ignore();
string s;
getline(cin, s);
string ans;
for (char c : s) {
if (c >= 'A' && c <= 'Z') {
char shifted = char('A' + (c - 'A' + k) % 26);
ans += shifted;
} else {
ans += c;
}
}
cout << ans << '\n';
return 0;
}
7. Код на Python 3
k = int(input())
s = input()
result = []
for c in s:
if 'A' <= c <= 'Z':
result.append(chr(ord('A') + (ord(c) - ord('A') + k) % 26))
else:
result.append(c)
print(''.join(result))
Комментарии