Pagina Principală
Ora 11

Numere Palindrom

Verifică dacă un număr este palindrom și inversează cifrele

40min teorie + 15min probleme PbInfo
Competența 3.4
Sigla liceului
TEORIE - 40 minute

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
Algoritmul de verificare
Inversarea cifrelor unui număr
Comparație dintre număr și invers

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

1
2
3
2
1
AXA DE SIMETRIE
1
2
3
2
1
1
2
3
2
1

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ă:

CUVÂNT PALINDROM

"ana", "cojoc", "elevele"

se citesc la fel în ambele sensuri
PROPOZIȚIE PALINDROM

"Ele fac cafele."

fără spații și semne de punctuație
NUMĂR PALINDROM

12321, 555, 1001

cifrele sunt simetrice
TEST PRACTIC

Scrie numărul pe o foaie

rotește foaia cu 180° - arată la fel

Cum verificăm dacă un număr este palindrom - în 3 pași simpli:

1
Scrie numărul pe o foaie

Exemplu: 12321

1
2
3
2
1
2
Întoarce foaia cu 180°

Sau citește de la coadă la cap:

1
2
3
2
1
1
2
3
2
1
3
Compară cele două variante

Dacă sunt identice → PALINDROM!

NumărÎntorsEste palindrom?
1232112321✅ DA
123321❌ NU

Algoritmul pentru Verificare Palindrom

1
Salvează numărul original

original = n - păstrăm o copie pentru comparație finală

2
Calculează inversul

Folosește algoritmul de inversare cifre

invers = 0 while (n != 0) { cifra = n % 10 invers = invers * 10 + cifra n = n / 10 }
3
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:

1
2
3
→ invers * 10 →
1
2
0
+ cifra 3 →
3
2
1
ALGORITM VerificaPalindrom VARIABILE n, original, invers, cifra: întreg ÎNCEPUT CITESTE n original ← n invers ← 0 // Calculează inversul ┌ CÂT TIMP n ≠ 0 EXECUTĂ │ cifra ← n % 10 │ invers ← invers * 10 + cifra │ n ← n / 10 └■ // Compară cu originalul ┌ DACA original = invers ATUNCI │ SCRIE "Numărul este palindrom" │ ALTEL │ SCRIE "Numărul NU este palindrom" └ SFÂRȘIT DACA SFÂRȘIT

Important: Toate numerele de o cifră (0-9) sunt palindroame. Cazul n=0 este tratat corect: invers=0, 0=0 → palindrom.

ALGORITM InverseazaNumar VARIABILE n, invers, cifra: întreg ÎNCEPUT CITESTE n invers ← 0 ┌ CÂT TIMP n ≠ 0 EXECUTĂ │ cifra ← n % 10 │ invers ← invers * 10 + cifra │ n ← n / 10 └■ SCRIE "Inversul este: ", invers SFÂRȘIT
1
2
3
4
5
5
4
3
2
1

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:
#include <iostream>
using namespace ______;
______ main() {
    int n;
    cin >> ______;
    int original = ______; // Salvăm numărul original
    int ______ = 0;
    ______ (n != 0) {
        int cifra = n ______ 10;
        invers = invers ______ 10 + cifra;
        n ______ 10;
    }
    ______ (original ______ invers) {
        cout << ______; // Este palindrom
    } ______ {
        cout << ______; // Nu este palindrom
    }
    return ______;
}
Bancă de cuvinte:
std int n invers while % * /= if == 1 else 0

Test de înțelegere: Care este inversul?

Test rapid:

Care va fi inversul numărului 1200?

Algoritmul de inversare:
invers ← 0 ┌ CÂT TIMP n ≠ 0 EXECUTĂ │ cifra ← n % 10 │ invers ← invers * 10 + cifra │ n ← n / 10 └■

Capcane comune și soluții pentru palindrom

Greșeli frecvente la verificarea palindromului:

❌ Uitarea să salvezi numărul original
invers ← 0 while (n != 0) { invers = invers * 10 + n % 10; n = n / 10; } // GREȘIT: n este acum 0, nu putem compara! if (n == invers) { ... }

Soluție: Salvează original = n înainte de buclă

❌ Confuzia cu zerourile finale

Pentru n=1200, inversul este 21, dar 1200 ≠ 21. Atenție la numerele care se termină cu 0!

// Numerele care se termină cu 0 NU pot fi palindroame // (decât dacă sunt 0 singur) // Exemplu: 1200 → invers=21 → nu e palindrom
❌ Compararea greșită

Folosirea lui n (care devine 0) în loc de original pentru comparație.

Best Practices pentru palindrom:

✅ Salvează întotdeauna originalul: original = n
✅ Folosește nume descriptive: invers, cifra, original
✅ Testează cazuri speciale: 0, 1, 10, 121, 1001, 1200
✅ Verifică formula de inversare: invers = invers * 10 + cifra
✅ Afișează clar rezultatul: "DA" sau "NU", 1 sau 0 conform cerinței

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

De ce? Pentru că inversul lor începe cu cifra 0, care nu se scrie!
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!

PROBLEME PBINFO - 15 minute

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:
  1. Citim numărul n
  2. Salvăm original ← n
  3. Calculăm inversul:
    • invers ← 0
    • while (n != 0)
    • cifra = n % 10
    • invers = invers * 10 + cifra
    • n = n / 10
  4. Comparăm: if (original == invers)
  5. Afișăm 1 (DA) sau 0 (NU)
Execuție pentru n=12321:
original=12321
Iterația 1: n=12321, cifra=1 → invers=0×10+1=1 → n=1232
Iterația 2: n=1232, cifra=2 → invers=1×10+2=12 → n=123
Iterația 3: n=123, cifra=3 → invers=12×10+3=123 → n=12
Iterația 4: n=12, cifra=2 → invers=123×10+2=1232 → n=1
Iterația 5: n=1, cifra=1 → invers=1232×10+1=12321 → n=0
Comparație: original=12321, invers=12321 → EGALE → 1 (DA)
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:
  1. Citim numărul n
  2. Inițializăm invers ← 0
  3. Folosim while (n != 0):
    • cifra = n % 10 (ultima cifră)
    • invers = invers * 10 + cifra (deplasează și adaugă)
    • n = n / 10 (elimină ultima cifră)
  4. Afișăm inversul
Cum funcționează formula invers = invers * 10 + cifra:
Pentru n=1234:
Start: invers=0
Cifra 4: invers=0×10+4=4
Cifra 3: invers=4×10+3=43
Cifra 2: invers=43×10+2=432
Cifra 1: invers=432×10+1=4321
REZULTAT: 4321 ✓
De ce această problemă este importantă?

Inversarea cifrelor este baza pentru multe algoritmi:

  1. Verificare palindrom (PbInfo #5)
  2. Extragerea cifrelor în ordine inversă
  3. Crearea de numere simetrice
  4. 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:
  1. Citim a și b
  2. Contor ← 0
  3. 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
  4. 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:
i=10: 10 nu e palindrom (se termină cu 0) → contor=0
i=11: 11 este palindrom → contor=1
i=12: 12 nu e palindrom (12 ≠ 21) → contor=1
i=13-19: niciunul nu e palindrom
i=20: 20 nu e palindrom (se termină cu 0) → contor=1
REZULTAT: contor=1 ✓
EXERCIȚII PRACTICE - 10 minute

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)
Execuție pas cu pas pentru n=131:
Start: original=131, invers=0, n=131
Iterația 1: cifra=1 → invers=0×10+1=1 → n=13
Iterația 2: cifra=3 → invers=1×10+3=13 → n=1
Iterația 3: cifra=1 → invers=13×10+1=131 → n=0
Comparație: original(131) == invers(131) → "DA" ✓

Descarcă toate exercițiile și soluțiile