Grade 10 · Character stringsCitește în română

Caesar cipher

Original: Cifrul lui Cezar

O(n)C++1746 lines2 examples

The idea

Every letter is replaced by the letter k positions further in the alphabet, circularly (after 'z' comes 'a'). We turn the letter into its position 0..25 (c - 'a'), add k, take the remainder modulo 26 and go back to a letter. Uppercase letters are handled the same way with 'A'; all other characters stay unchanged. k is read, then the text on the next line; cin.get() consumes the '\n' left after reading k.

Original description (Romanian)

Fiecare literă se înlocuiește cu litera aflată la k poziții mai departe în alfabet, circular (după 'z' urmează 'a'). Transformăm litera în poziția ei 0..25 (c - 'a'), adunăm k, luăm restul la 26 și revenim la literă. Literele mari se tratează la fel, cu 'A'; restul caracterelor rămân neschimbate. Se citesc k, apoi textul pe rândul următor; cin.get() consumă caracterul '\n' rămas după citirea lui k.

Complexity
O(L)
Grade
Grade 10 (Clasa a X-a)

Examples

Example 1

Input

3
Ana are mere, Zoe!

Expected output

Dqd duh phuh, Crh!
Example 2

Input

25
abc XYZ

Expected output

zab WXY

The code

Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.

cifrul-lui-cezar.cpp
/*
 * Titlu: Cifrul lui Cezar
 * Clasa: 10
 * Capitol: Șiruri de caractere
 * Descriere: Fiecare literă se înlocuiește cu litera aflată la k poziții mai
 *            departe în alfabet, circular (după 'z' urmează 'a'). Transformăm
 *            litera în poziția ei 0..25 (c - 'a'), adunăm k, luăm restul la 26 și
 *            revenim la literă. Literele mari se tratează la fel, cu 'A'; restul
 *            caracterelor rămân neschimbate. Se citesc k, apoi textul pe rândul
 *            următor; cin.get() consumă caracterul '\n' rămas după citirea lui k.
 * Complexitate: O(L)
 *
 * Exemplu
 * Intrare:
 * 3
 * Ana are mere, Zoe!
 * Ieșire: Dqd duh phuh, Crh!
 *
 * Exemplu
 * Intrare:
 * 25
 * abc XYZ
 * Ieșire: zab WXY
 */
#include <iostream>
using namespace std;

int main()
{
    int k;
    char s[256];
    cin >> k;
    cin.get();              // sărim peste '\n' de după numărul k
    cin.getline(s, 256);
    k = k % 26;
    for (int i = 0; s[i] != '\0'; i++)
    {
        if (s[i] >= 'a' && s[i] <= 'z')
            s[i] = 'a' + (s[i] - 'a' + k) % 26;
        else if (s[i] >= 'A' && s[i] <= 'Z')
            s[i] = 'A' + (s[i] - 'A' + k) % 26;
    }
    cout << s << '\n';
    return 0;
}

Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.