Grade 10 · Character stringsCitește în română
Caesar cipher
Original: Cifrul lui Cezar
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)
- Chapter
- Character strings
Examples
Input
3 Ana are mere, Zoe!
Expected output
Dqd duh phuh, Crh!
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.
/*
* 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.