Редакция для Шифр Цезаря: шифрование


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
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 -> B
  • Y -> Z
  • Z -> A

Для этого удобно использовать остаток от деления по модулю 26.


Наблюдение 2. Удобно перейти от буквы к номеру

Каждую букву можно представить как номер от 0 до 25:

  • A — это 0
  • B — это 1
  • ...
  • Z — это 25

Если символ c — заглавная буква, то её номер равен c - 'A'.

После сдвига новый номер будет:

(c - 'A' + k) % 26

Остаётся вернуть его обратно в букву:

'A' + новый_номер


Наблюдение 3. Пробелы и другие символы менять не нужно

По условию шифруются только заглавные латинские буквы.
Значит, если символ не находится в диапазоне от A до Z, его просто копируем в ответ без изменений.


3. Алгоритм

  1. Считать число k.
  2. Считать всю вторую строку целиком.
  3. Создать пустую строку ответа.
  4. Для каждого символа строки:
    • если символ находится между A и Z:
      • вычислить его позицию в алфавите;
      • прибавить k;
      • взять остаток по модулю 26;
      • превратить обратно в букву и добавить в ответ;
    • иначе добавить символ в ответ без изменений.
  5. Вывести получившуюся строку.

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))

Комментарии

Еще нет ни одного комментария.