Ce vei învăța astăzi?
După această lecție, vei stăpâni verificarea palindromului și inversarea cifrelor unui număr.
Ce este un Număr Palindrom?
Definiție: Un număr palindrom este un număr care citit de la stânga la dreapta este identic cu cititul de la dreapta la stânga.
Exemple: 121, 12321, 7, 44, 1001, 0
Simetrie perfectă: prima cifră = ultima, a doua = penultima, etc.
Analogie: Citirea unei cărți în oglindă
Gândește-te la un număr palindrom ca la un text care se citește la fel în oglindă:
"ana", "cojoc", "elevele"
se citesc la fel în ambele sensuri"Ele fac cafele."
fără spații și semne de punctuație12321, 555, 1001
cifrele sunt simetriceScrie numărul pe o foaie
rotește foaia cu 180° - arată la felCum verificăm dacă un număr este palindrom - în 3 pași simpli:
Scrie numărul pe o foaie
Exemplu: 12321
Întoarce foaia cu 180°
Sau citește de la coadă la cap:
Compară cele două variante
Dacă sunt identice → PALINDROM!
| Număr | Întors | Este palindrom? |
|---|---|---|
| 12321 | 12321 | ✅ DA |
| 123 | 321 | ❌ NU |
Algoritmul pentru Verificare Palindrom
Salvează numărul original
original = n - păstrăm o copie pentru comparație finală
Calculează inversul
Folosește algoritmul de inversare cifre
Compară cu originalul
original == invers
Dacă sunt egale → palindrom, altfel → nu e palindrom
🎯 TRUC DE MEMORARE: Formula invers = invers * 10 + cifra
Gândește-te la un tren de vagoane:
invers * 10= "mută toate vagoanele cu o poziție la stânga"+ cifra= "adaugă noul vagon la sfârșit"
Exemplu vizual pentru 123 → 321:
Important: Toate numerele de o cifră (0-9) sunt palindroame. Cazul n=0 este tratat corect: invers=0, 0=0 → palindrom.
Cum funcționează: invers = invers * 10 + cifra deplasează cifrele spre stânga și adaugă noua cifră la sfârșit.
| Număr | Invers | Este palindrom? | Explicație |
|---|---|---|---|
| 121 | 121 | ✅ DA | original = invers |
| 123 | 321 | ❌ NU | 121 ≠ 321 |
| 7 | 7 | ✅ DA | toate numerele de 1 cifră sunt palindroame |
| 1001 | 1001 | ✅ DA | simetric chiar dacă are zerouri |
| 1230 | 321 | ❌ NU | 1230 ≠ 321 |
Exersăm împreună: n = 121
| Pas | n | n % 10 (ultima cifră) |
invers = invers * 10 + cifra | n = n / 10 (noua valoare) |
|---|---|---|---|---|
| Start | 121 | - | invers = 0 | - |
| Pas 1 | 121 | 1 | 0 × 10 + 1 = 1 | 12 |
| Pas 2 | 12 | 2 | 1 × 10 + 2 = 12 | 1 |
| Pas 3 | 1 | 1 | 12 × 10 + 1 = 121 | 0 |
Final: original=121, invers=121 → DA, este palindrom!
Exercițiu de completare - Verificare palindrom:
Completează codul C++ pentru verificarea palindromului:
Bancă de cuvinte:
Test de înțelegere: Care este inversul?
Test rapid:
Care va fi inversul numărului 1200?
Algoritmul de inversare:
Capcane comune și soluții pentru palindrom
Greșeli frecvente la verificarea palindromului:
Soluție: Salvează original = n înainte de buclă
Pentru n=1200, inversul este 21, dar 1200 ≠ 21. Atenție la numerele care se termină cu 0!
Folosirea lui n (care devine 0) în loc de original pentru comparație.
Best Practices pentru palindrom:
original = n
invers = invers * 10 + cifra
Reguli rapide pentru a recunoaște palindroamele:
Regula 1: Toate numerele de o cifră sunt palindroame
0, 1, 2, ..., 9 - toate sunt palindroame ✓
Regula 2: Numerele care se termină cu 0 NU sunt palindroame
10, 20, 100, 1200 - nu sunt palindroame (cu excepția lui 0) ✗
Regula 3: Prima cifră = ultima cifră
Dacă prima și ultima cifră sunt diferite, sigur nu e palindrom
123 → 1 ≠ 3 → nu e palindrom (chiar dacă nu calculăm inversul)
Regula 4: Numărul de cifre poate fi par sau impar
Impar: 121 (3 cifre), 12321 (5 cifre)
Par: 1221 (4 cifre), 1001 (4 cifre)
Nu contează dacă are număr par sau impar de cifre!
PbInfo #5 - Verificare palindrom
Enunț:
Cerință: Se citește un număr natural n. Să se verifice dacă n este palindrom.
Date de intrare:
Programul citește de la tastatură numărul n.
Date de ieșire:
Programul va afișa pe ecran 1 dacă n este palindrom, respectiv 0 în caz contrar.
Exemplu:
Intrare:
121
Ieșire:
1
Explicație: 121 citit invers este tot 121
Cum gândim soluția:
- Citim numărul n
- Salvăm
original ← n - Calculăm inversul:
invers ← 0while (n != 0)cifra = n % 10invers = invers * 10 + cifran = n / 10
- Comparăm:
if (original == invers) - Afișăm 1 (DA) sau 0 (NU)
Execuție pentru n=12321:
Ce trebuie să verifici mereu?
- Cazul n=0: invers=0, 0==0 → 1 (DA)
- Numere de o cifră: toate sunt palindroame
- Numere care se termină cu 0: 10, 120, 1000 → nu pot fi palindroame
- Salvare original: esențială pentru comparație
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int original = n; // Salvăm numărul original
int invers = 0;
// Calculăm inversul
while (n != 0) {
int cifra = n % 10;
invers = invers * 10 + cifra;
n /= 10;
}
// Verificăm dacă este palindrom
if (original == invers) {
cout << 1;
} else {
cout << 0;
}
return 0;
}
Ce învățăm din această problemă:
- Salvare original: Esențială pentru că n devine 0 în buclă
- Formula inversării:
invers = invers * 10 + cifra - Comparație simplă:
original == invers - Format output: 1 pentru DA, 0 pentru NU (standard PbInfo)
- Cazuri speciale: n=0, n de o cifră, numere cu zerouri finale
PbInfo #6 - Inversul unui număr
Problemă care exersează algoritmul de inversare
Enunț:
Cerință: Se citește un număr natural n. Să se afișeze inversul lui n.
Date de intrare:
Programul citește de la tastatură numărul n.
Date de ieșire:
Programul va afișa pe ecran inversul numărului n.
Exemplu:
Intrare:
1234
Ieșire:
4321
Explicație: Cifrele în ordine inversă
Cum gândim soluția:
- Citim numărul n
- Inițializăm
invers ← 0 - Folosim while (n != 0):
cifra = n % 10(ultima cifră)invers = invers * 10 + cifra(deplasează și adaugă)n = n / 10(elimină ultima cifră)
- Afișăm inversul
Cum funcționează formula invers = invers * 10 + cifra:
De ce această problemă este importantă?
Inversarea cifrelor este baza pentru multe algoritmi:
- Verificare palindrom (PbInfo #5)
- Extragerea cifrelor în ordine inversă
- Crearea de numere simetrice
- Rezolvarea problemelor cu oglindire
Formula cheie: invers = invers * 10 + cifra
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int invers = 0;
while (n != 0) {
// Extragem ultima cifră
int cifra = n % 10;
// Adăugăm cifra la invers, deplasând cifrele existente
invers = invers * 10 + cifra;
// Eliminăm ultima cifră
n /= 10;
}
cout << invers;
return 0;
}
Varianta alternativă (mai scurtă):
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int invers = 0;
// Varianta compactă
while (n) { // echivalent cu while (n != 0)
invers = invers * 10 + n % 10;
n /= 10;
}
cout << invers;
return 0;
}
Ce învățăm din această problemă:
- Formula fundamentală:
invers = invers * 10 + cifra - Cum funcționează: Înmulțirea cu 10 deplasează cifrele la stânga
- Tratarea lui n=0: Bucla nu se execută, invers rămâne 0 (corect)
- Numere cu zerouri finale: 1200 → invers=21 (zerourile de la început dispar)
- Aplicații practice: Baza pentru verificare palindrom
PbInfo Bonus - Numărul de palindroame într-un interval
Pentru cei care vor o provocare în plus
Enunț:
Cerință: Se citesc două numere naturale a și b. Să se afișeze câte numere palindrom sunt în intervalul [a, b].
Date de intrare:
Programul citește de la tastatură numerele a și b.
Date de ieșire:
Programul va afișa pe ecran numărul de palindroame din interval.
Exemplu:
Intrare:
10 20
Ieșire:
1
Explicație: În intervalul [10, 20] singurul palindrom este 11
Cum gândim soluția:
- Citim a și b
- Contor ← 0
- Pentru fiecare număr i de la a la b:
- Verificăm dacă i este palindrom (folosind algoritmul învățat)
- Dacă DA, creștem Contor cu 1
- Afișăm Contor
Sfat: Folosiți o funcție separată pentru verificarea palindromului, ca să nu repetați codul.
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
// Funcție care verifică dacă un număr este palindrom
bool estePalindrom(int n) {
int original = n;
int invers = 0;
while (n != 0) {
int cifra = n % 10;
invers = invers * 10 + cifra;
n /= 10;
}
return (original == invers);
}
int main() {
int a, b;
cin >> a >> b;
int contor = 0;
// Parcurge fiecare număr din intervalul [a, b]
for (int i = a; i <= b; i++) {
if (estePalindrom(i)) {
contor++;
}
}
cout << contor;
return 0;
}
Varianta alternativă (fără funcție):
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int contor = 0;
for (int i = a; i <= b; i++) {
int n = i;
int original = n;
int invers = 0;
while (n != 0) {
invers = invers * 10 + n % 10;
n /= 10;
}
if (original == invers) {
contor++;
}
}
cout << contor;
return 0;
}
Ce învățăm din această problemă:
- Reutilizare cod: Folosim același algoritm de palindrom de mai multe ori
- Funcții: Este mai elegant să scriem o funcție separată pentru verificare
- Parcurgere interval:
for (int i = a; i <= b; i++) - Contorizare: Creștem contorul doar când găsim un palindrom
- Optimizare: Putem sări peste numerele care se termină cu 0 (nu sunt palindroame)
Execuție pentru a=10, b=20:
Exercițiul Practic: Palindroame și Inverse
Sarcini de lucru
Completează următoarele sarcini pentru a-ți consolida cunoștințele despre palindroame
Sarcina 1: Analiză algoritm palindrom
Analizează algoritmul pentru verificarea palindromului:
Pentru n=120, care va fi rezultatul și de ce? Este 120 un palindrom?
Soluție pentru Sarcina 1:
Analiza pentru n=120:
- Pasul 1: original = 120
- Pasul 2 - Calcul invers:
- Iterația 1: n=120, cifra=0 → invers = 0×10+0 = 0, n=12
- Iterația 2: n=12, cifra=2 → invers = 0×10+2 = 2, n=1
- Iterația 3: n=1, cifra=1 → invers = 2×10+1 = 21, n=0
- Pasul 3 - Comparație: original=120, invers=21
- Rezultat: 120 ≠ 21 → NU este palindrom
Concluzie importantă: Un număr care se termină cu 0 (și nu este 0) NU poate fi niciodată palindrom, deoarece inversul său va avea mai puține cifre (zerourile de la început dispar).
Regulă generală: Dacă n > 0 și n % 10 == 0, atunci n NU este palindrom (cu excepția lui 0).
Sarcina 2: Verifică dacă un număr este palindrom - varianta completă
Cerință: Implementează în C++ un program care citește n și afișează "DA" dacă este palindrom, altfel "NU".
Soluție pentru Sarcina 2:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
// Pasul 1: Salvăm numărul original
int original = n;
int invers = 0;
// Pasul 2: Calculăm inversul
while (n != 0) {
int cifra = n % 10; // Extragem ultima cifră
invers = invers * 10 + cifra; // Adăugăm la invers
n = n / 10; // Eliminăm ultima cifră
}
// Pasul 3: Comparăm cu originalul
// Pasul 4: Afișăm rezultatul
if (original == invers) {
cout << "DA";
} else {
cout << "NU";
}
return 0;
}
Explicații importante:
- Salvare original: Esențială! n devine 0 în buclă, nu putem compara cu el.
- Formula de inversare:
invers = invers * 10 + cifra- înmulțirea cu 10 "deplasează" cifrele la stânga. - Cazul n=0: Bucla nu se execută, invers rămâne 0, 0==0 → "DA" (corect, 0 e palindrom).
- Cazul numerelor care se termină cu 0: 120 → invers=21 → "NU" (corect, 120 nu e palindrom).
- Teste recomandate:
- 121 → "DA"
- 123 → "NU"
- 7 → "DA" (toate numerele de o cifră sunt palindroame)
- 1001 → "DA"
- 10 → "NU" (numerele care se termină cu 0 nu sunt palindroame, cu excepția lui 0)