Hola25
Hola25 Logo
Hola25
Utilizatori disponibili

Înapoi la blog

Piese dintr-un șir sunt selectate și păstrate în aceeași ordine pe o bandă de hârtie.
Ilustrație conceptuală generată cu AI; explicațiile și schemele de învățare sunt în articol.
Informatică

Subprogram BAC: eliminarea cifrelor impare în C++

Hola25
Hola25
Autor

21 octombrie 2026

6 min citire

În acest articol

Un subprogram care elimină cifrele impare trebuie să păstreze ordinea cifrelor rămase. La BAC, dificultatea apare fiindcă extragerea prin rest la zece parcurge numărul de la dreapta la stânga. Dacă reconstruiești rezultatul ca și cum cifrele ar sosi în ordinea inițială, le vei inversa.

Lecția privește proiectarea subprogramelor de la matematică-informatică și folosește algoritmi elementari asupra cifrelor. Vom defini o funcție care primește un număr natural de cel mult un miliard și returnează numărul obținut prin eliminarea cifrelor impare. Când nu rămâne nicio cifră, rezultatul convenit este zero. Compară această convenție cu cea din enunțul de BAC pe care îl rezolvi.

Stabilește contractul funcției

Contractul precizează intrarea, rezultatul și cazurile speciale. Intrarea este un număr natural, deci nu analizăm semnul minus. Rezultatul este tot un număr, nu un text care păstrează zerouri la început.

Cifrele pare sunt zero, doi, patru, șase și opt. Cifra zero trebuie păstrată atunci când apare într-o poziție relevantă a numărului rezultat. Totuși, un rezultat numeric nu poate distinge între reprezentările cu mai multe zerouri inițiale.

Pentru numărul trei sute cinci, eliminarea cifrelor trei și cinci lasă cifra zero, iar rezultatul este zero. Pentru numărul o sută treizeci și cinci, nu rămâne nicio cifră pară, dar convenția noastră produce tot zero. Dacă problema cere să deosebești situațiile, trebuie returnată și o informație suplimentară.

Reconstruiește rezultatul cu o putere a lui zece

Extragem ultima cifră a copiei numărului. Dacă este pară, o adăugăm în rezultat pe poziția zecimală liberă cea mai mică. Un multiplicator pornește de la unu și se înmulțește cu zece numai după păstrarea unei cifre.

De ce numai atunci? O cifră eliminată nu ocupă nicio poziție în rezultatul final. Dacă ai avansa multiplicatorul și pentru ea, ai lăsa un loc gol, reprezentat numeric printr-un zero nedorit.

Pentru numărul două sute treizeci și patru, extragem mai întâi patru și îl păstrăm pe poziția unităților. Cifra trei este eliminată, iar multiplicatorul rămâne zece. Cifra doi este apoi pusă pe poziția zecilor, obținând douăzeci și patru.

Program C++ complet

Parametrul este transmis prin valoare. Funcția poate împărți copia la zece până când termină analiza, fără să modifice numărul din programul principal. Tipul întreg mai larg lasă loc și multiplicatorului intermediar, care poate depăși rezultatul final.

#include <iostream>
using namespace std;

long long eliminaImpare(long long n) {
    long long rezultat = 0, pozitie = 1;
    do {
        int cifra = int(n % 10);
        if (cifra % 2 == 0) {
            rezultat += cifra * pozitie;
            pozitie *= 10;
        }
        n /= 10;
    } while (n != 0);
    return rezultat;
}

int main() {
    long long n;
    cin >> n;
    cout << eliminaImpare(n);
    return 0;
}

Bucla executată cel puțin o dată tratează numărul zero ca având cifra zero. Pentru alte numere, fiecare pas elimină ultima cifră din copia de lucru. Procesul se termină după analizarea tuturor cifrelor.

Tabel de urmărire pentru un exemplu mixt

Consideră numărul optzeci și trei de mii patruzeci și doi. Cifrele sunt analizate în ordinea doi, patru, zero, trei, opt. Cifrele păstrate, în ordinea inițială, trebuie să formeze numărul opt mii patruzeci și doi.

Cifră extrasă Se păstrează? Rezultat după pas Poziție pentru următoarea cifră păstrată
2 Da 2 10
4 Da 42 100
0 Da 42 1000
3 Nu 42 1000
8 Da 8042 10000

La cifra zero, rezultatul numeric nu crește, dar multiplicatorul avansează. Această schimbare păstrează locul lui zero în viitorul rezultat. Dacă ai ignora cifra zero complet, ai obține opt sute patruzeci și doi, ceea ce ar fi greșit.

De ce formula de inversare nu este potrivită

Actualizarea rezultatului prin înmulțire cu zece și adăugarea cifrei extrase construiește cifrele în ordinea în care sosesc. Deoarece extragerea începe din dreapta, rezultatul ar conține cifrele păstrate în ordine inversă.

Pentru două sute treizeci și patru, acea variantă ar construi mai întâi patru și apoi patruzeci și doi. Rezultatul corect este douăzeci și patru. Un test cu cifre pare distincte observă eroarea imediat.

Un test alcătuit numai din aceeași cifră pară ar putea ascunde inversarea. De aceea, exemplele de verificare trebuie alese pentru a diferenția algoritmii, nu doar pentru a produce un rezultat simplu.

Zerourile inițiale și reprezentarea numerică

După eliminarea cifrelor impare din o sută doi rămân caracterele zero și doi, dar valoarea numerică este doi. Programul returnează un număr, deci afișarea obișnuită nu păstrează zeroul inițial.

Dacă cerința ar solicita textul format din cifrele rămase, inclusiv zerourile inițiale, un rezultat numeric nu ar păstra suficientă informație. Ar trebui folosit un șir sau o reprezentare care include și lungimea.

Această diferență nu este un defect al algoritmului, ci o consecință a contractului. Înainte de implementare, decide dacă rezultatul reprezintă o valoare numerică sau o secvență de simboluri.

Păstrarea numărului inițial

În programul principal, numărul citit rămâne neschimbat după apel, deoarece funcția primește o copie. Ai putea afișa atât numărul inițial, cât și rezultatul, dacă problema ar cere acest lucru.

Dacă antetul impus ar folosi un parametru prin referință care trebuie transformat, ar trebui să atribui rezultatul variabilei respective. Nu presupune că aceeași implementare are automat aceeași interfață în toate problemele despre cifre.

Respectarea antetului este parte din rezolvare. O funcție corectă matematic poate să nu răspundă cerinței dacă returnează rezultatul într-un alt mod decât cel solicitat.

Verificarea și eficiența

Testează zero, un număr cu toate cifrele impare, unul cu toate cifrele pare și unul care conține zerouri între cifre păstrate. Adaugă un exemplu în care prima cifră este eliminată, pentru a verifica dispariția zerourilor inițiale din reprezentarea numerică.

Fiecare cifră este analizată o singură dată. Timpul depinde de numărul cifrelor, iar memoria auxiliară este constantă. Nu este necesară memorarea tuturor cifrelor într-un tablou pentru această transformare.

Explică rolul fiecărei variabile: copia se scurtează, rezultatul păstrează cifrele acceptate, iar multiplicatorul arată următoarea poziție disponibilă. Această schemă face mai ușoară înțelegerea algoritmului și adaptarea lui la alte condiții asupra cifrelor.

Exerciții cu răspunsuri

Numărul este 2468. Toate cifrele sunt pare, deci rezultatul este 2468. Ordinea trebuie păstrată.

Numărul este 13579. Nu rămâne nicio cifră, iar convenția funcției produce zero.

Numărul este 10203. Se păstrează zero, doi și zero, iar valoarea rezultatului este douăzeci. Zeroul din dreapta rămâne semnificativ.

Numărul este 2004. Rezultatul rămâne 2004. Ambele zerouri interioare ocupă poziții care trebuie păstrate.

Întrebări frecvente

Zero este cifră pară?

Da. Restul împărțirii lui zero la doi este zero. Eliminarea cifrelor impare nu elimină automat cifrele zero.

De ce multiplicatorul crește numai pentru cifre păstrate?

El numără pozițiile ocupate în rezultat. O cifră eliminată nu trebuie să lase un loc suplimentar între cele rămase.

Cum adaptez soluția la un antet cerut?

Separă mai întâi algoritmul de modul în care livrezi rezultatul: valoare returnată sau parametru de ieșire. Pentru feedback asupra adaptării, poți discuta cu un profesor de informatică.

Surse