InfoBook.ro ← Harta anului
Modul 03 · Prelucrarea numerelor
Modul 03 · Conținut 2.2

Numerele, luate cifră cu cifră

Jumătate din subiectele de BAC încep cu „se citește un număr natural n…". Azi înveți uneltele care rezolvă toată familia: extragerea cifrelor, divizorii și algoritmul lui Euclid — vechi de 2300 de ani, încă neînvins.

🎯 Obiectiv 1Stăpânești perechea magică n%10 și n/10 — și construiești inversul unui număr.
🎯 Obiectiv 2Parcurgi divizorii eficient și descompui un număr în factori primi.
🎯 Obiectiv 3Aplici Euclid (scăderi și împărțiri) și compari eficiența celor două variante.
1

Cutia de unelte pentru cifre

Patru formule care apar în 90% din problemele cu numere. Învață-le ca pe tabla înmulțirii.

Ultima cifră

ultima_cifra = n % 10

restul împărțirii la 10 · 573 % 10 = 3

Tai ultima cifră

n = n / 10  (C++) · n // 10 (Py)

573 / 10 = 57 — împărțire întreagă!

Adaug cifră la dreapta

n = n * 10 + ultima_cifra

57 → 57·10+9 = 579

Adaug cifră la stânga

n = ultima_cifra * putere + n

putere = 10nr. cifre   →   9 · 100 + 57 = 957

🔑 Șablonul universal — un schelet, multe probleme

Cât timp mai sunt cifre, extragi ultima și o prelucrezi. Schimbi doar linia « prelucrez ultima_cifra » → rezolvi altă problemă. Alege limbajul:

Linia « prelucrez ultima_cifra », pentru cele cinci probleme:

Suma cifrelor
Numărul de cifre
Nr. de cifre pare
Cifra maximă
Oglinditul
2

Simulator: suma cifrelor

Prima aplicare a șablonului: golim numărul cifră cu cifră și le adunăm într-un „coș" numit suma.

n =
DA NU START citește n suma ← 0 n > 0 ? ultima_cifra ← n % 10 suma ← suma + ultima_cifra n ← [n / 10] scrie suma STOP fiecare cifră iese din n și se adună în coșul suma
Variabile
n—
ultima_cifra—
suma—
Ecran
 
nultima_cifrasuma
Apasă „Pas cu pas" și urmărește cum suma adună cifră după cifră. 👣
🎯 pbInfo #10 — Suma cifrelor ↗

🧪 Variații pe același schelet

Schimbi doar linia de prelucrare din schelet — restul rămâne identic. Codul complet, în trei limbaje:

🔢 Numărul de cifre — numeri câte cifre are n

🎯 pbInfo #66 — Numărul de cifre ↗

➗ Câte cifre pare — numeri cifrele pare

🎯 pbInfo #4570 — Numărul cifrelor pare ↗

🔝 Cifra maximă — cea mai mare cifră

🎯 pbInfo #68 — Cifra maximă ↗
3

Simulator: inversul unui număr

Același schelet, altă prelucrare: cifrele „se mută" din n în inversul — și pentru că ies de la coadă, numărul se răstoarnă.

n =
DA NU START citește n inversul ← 0 n > 0 ? ultima_cifra ← n % 10 inversul ← inversul · 10 + ultima_cifra n ← [n / 10] scrie inversul STOP cifra iese din n și intră în inversul — de-asta ordinea se inversează
Variabile
n—
ultima_cifra—
inversul—
Ecran
 
nultima_cifrainversul
Apasă „Pas cu pas" și urmărește cum inversul crește în timp ce n se golește. 👣
Compară cu suma cifrelor: singura linie diferită e prelucrarea — inversul ← inversul·10 + ultima_cifra în loc de suma ← suma + ultima_cifra. Schimbi o linie → rezolvi altă problemă. Ăsta e șablonul!
Capcana de BAC: dacă n se termină în zero (de ex. 570 → 75), inversul „pierde" zeroul — e normal, 075 nu există ca număr. Iar dacă distrugi n în buclă și îl mai folosești după… l-ai pierdut! Salvează-l într-o copie înainte.
🎯 pbInfo #69 — Oglinditul (inversul) unui număr ↗
4

Simulator: reconstrucția cu puteri ale lui 10

Problema-capcană: construiește numărul doar din cifrele pare ale lui n, păstrând ordinea lor. Metoda de la invers nu merge — cifrele ar ieși răsturnate!

n =
DA NU DA NU citește n nr_nou ← 0 putere ← 1 n > 0 ? ultima_cifra ← n % 10 ultima_cifra % 2 == 0 ? nr_nou ← ultima_cifra · putere + nr_nou putere ← putere · 10 n ← [n / 10] scrie nr_nou STOP cifra impară sare peste update — doar cifrele pare intră în nr_nou
Variabile
n—
ultima_cifra—
putere—
nr_nou—
Ecran
 
ultima_cifrapară?puterenr_nou
Pentru 28371, rezultatul corect e 28 — cifrele pare 2 și 8, în ordinea lor. Verifică pas cu pas! 👣
Diferența-cheie față de invers: acolo cifra nouă împinge totul la stânga (nr_nou·10 + ultima_cifra); aici cifra se lipește în față, la poziția dictată de putere (ultima_cifra·putere + nr_nou), iar putere crește doar când chiar am folosit cifra. Alege metoda după ordinea în care vrei cifrele!
🎯 pbInfo #2289 — Cifre pare și impare ↗
5

Divizorii unui număr — și prima lecție de eficiență

Un divizor e un număr care îl împarte exact pe n. Întrebarea de aur: până unde are rost să cauți?

🔍 Explorator de divizori

n =
verificări: 0
divizori găsiți: —
🎯 pbInfo #376 — Suma divizorilor ↗

🔑 De ce merge trucul cu √n

1

Divizorii vin mereu în perechi. Dacă divizor îl împarte exact pe n, atunci și n / divizor îl împarte. Niciodată nu găsești un divizor singur — vine la pachet cu perechea lui.

2

Din fiecare pereche, unul e mereu ≤ √n. Dacă amândoi ar fi mai mari decât √n, produsul lor ar depăși n — ceea ce e imposibil, pentru că produsul lor este chiar n.

3

Deci cauți doar până la √n. Pe cel mic îl găsești căutând, pe cel mare îl primești gratis: îl calculezi cu o simplă împărțire, n / divizor.

Perechile lui 36 — √36 = 6
1×36
2×18
3×12
4×9
6×6
≤ 6 — aici cauți (5 verificări) > 6 — le primești pe gratis
n🐢 verificări până la n🐇 verificări până la √nde câte ori mai puțin
363666 ×
10.00010.000100100 ×
1.000.0001.000.0001.0001.000 ×
Asta înseamnă eficiență: același răspuns, alt drum. Nu schimbi problema și nu schimbi limbajul — schimbi doar cât de departe mergi.

🏁 Numere prime — cursa celor două metode

Un număr e prim dacă are exact 2 divizori: 1 și el însuși. Ca să afli dacă n e prim, cauți un divizor între 2 și … până unde? Ambele programe de mai jos sunt corecte și dau același răspuns. Diferă printr-un singur lucru: locul unde se opresc.

Capcanele clasice: 1 nu e prim (are un singur divizor), 0 și numerele negative nu sunt prime, iar 2 e singurul prim par. De aceea pornim cu prim = (n >= 2).

Le punem să facă exact aceeași treabă: să verifice, pe rând, fiecare număr de la 2 până la limita aleasă și să numere câte sunt prime. Răspunsul va fi identic. Timpul — nu.

verifică toate numerele până la

🐢 Varianta 1 — merg până la n − 1

a ajuns la numărul — · împărțiri: 0

🐇 Varianta 2 — mă opresc la √n

a ajuns la numărul — · împărțiri: 0
Notă pentru Python: range(2, n) merge de la 2 până la n − 1 — ultima valoare nu e inclusă, exact ca divizor <= n - 1 din C++. Iar range(2, int(n ** 0.5) + 1) merge de la 2 până la √n, la fel ca divizor * divizor <= n (n ** 0.5 este radicalul, iar int(...) taie partea zecimală).
Apasă Start cursa și urmărește bara. Ambele mașini au același motor — diferă doar drumul ales. 🏎️
🎯 pbInfo #45 — Verificare număr prim ↗
Morala: aceeași problemă, același rezultat, același limbaj — dar condiția divizor * divizor <= n în loc de divizor <= n - 1 face diferența între „merge" și „ia 100 de puncte". La concurs și la BAC, asta se numește complexitate.

🧱 Descompunerea în factori primi

Orice număr natural mai mare ca 1 se scrie într-un singur fel ca produs de numere prime — e teorema fundamentală a aritmeticii. Ideea algoritmului: iau cel mai mic factor posibil și împart cu el cât timp se poate, apoi trec la următorul.

n =
DA DA NU NU DA NU START citește n factor ← 2 factor·factor ≤ n ? n % factor = 0 ? scrie factor n ← [n / factor] factor ← factor + 1 n > 1 ? scrie n STOP bucla interioară stoarce factorul până la capăt, iar ce rămâne din n la final e tot un factor prim
Variabile
n—
factor—
Ecran
 
factorn % factorn rămas
Apasă „Pas cu pas" și urmărește cum n se micșorează până ajunge la 1. 👣
Exemplu complet — 360:
factor = 2: 360 : 2 = 180 → 180 : 2 = 90 → 90 : 2 = 45. Acum 45 % 2 ≠ 0, trecem mai departe.
factor = 3: 45 : 3 = 15 → 15 : 3 = 5. Acum 5 % 3 ≠ 0, trecem mai departe.
factor = 4: 4·4 = 16 > 5 → ieșim din buclă. Dar a rămas n = 5 > 1, deci îl afișăm și pe el.
Rezultat: 2 2 2 3 3 5, adică 360 = 2³ · 3² · 5. Observă că după ce am împărțit de trei ori cu 2, în n nu mai rămâne niciun 2 — de asta factorii ies mereu în ordine crescătoare și toți primi.
De ce e nevoie de dacă n > 1 atunci scrie n? Pentru că ne oprim la √n. Un număr poate avea cel mult un factor prim mai mare decât √n (dacă ar avea doi, produsul lor ar depăși n). Acel factor nu apucă să fie testat în buclă — dar el este exact ce a rămas în n la final. Fără linia asta, pentru n = 14 ai afișa doar 2 în loc de 2 7. Este greșeala numărul 1 la această problemă.
🎯 pbInfo #1319 — Descompunere în factori ↗
6

Algoritmul lui Euclid: cursa celor două variante

Cel mai mare divizor comun (cmmdc) — calculat cu scăderi repetate și cu împărțiri repetate, umăr la umăr. Cine termină primul?

a = b =

Varianta 1 — scăderi repetate

Varianta 2 — împărțiri cu rest

Varianta 1 — scăderi repetate

Varianta 2 — împărțiri cu rest

🎯 pbInfo #58 — Cel mai mare divizor comun ↗
🎁 Bonusul cursei — cel mai mic multiplu comun

După ce rulezi cursa, aici apare cmmmc(a, b), calculat direct din rezultatul cmmdc-ului. Apasă „Start cursa" 👆

🎯 pbInfo #59 — Cel mai mic multiplu comun ↗
Concluzia cursei: pentru a = 252, b = 18, scăderile fac 14 pași, împărțirile doar 2 — iar cu cât numerele cresc, cu atât diferența devine mai zdrobitoare. Ține minte ideea: DOI algoritmi corecți pot avea viteze complet diferite.
7

O problemă nerezolvată de 283 de ani

Până acum ai învățat unelte. Acum le folosești ca să te uiți la o întrebare pe care nimeni din lume n-a reușit s-o rezolve — și la care poți contribui cu propriul program.

📜 Scrisoarea din 7 iunie 1742

Christian Goldbach, matematician prusac, îi scrie prietenului său Leonhard Euler o observație aparent banală. Euler îi răspunde și o reformulează în felul în care o știm azi:

Conjectura lui Goldbach
Orice număr par mai mare decât 2 se poate scrie ca suma a două numere prime.
4 = 2+2  ·  6 = 3+3  ·  8 = 3+5  ·  10 = 3+7 = 5+5  ·  100 = 3+97 = 11+89 = …

Euler i-a răspuns că o consideră „o teoremă absolut sigură, deși nu o pot demonstra". Nici el, nici nimeni după el, nu a reușit. Au trecut 283 de ani.

1742Goldbach îi scrie lui Euler. Euler nu găsește demonstrația.
1937Vinogradov demonstrează că orice număr impar suficient de mare e suma a trei prime. Aproape — dar nu asta era întrebarea.
2000Editura Faber & Faber oferă 1 milion de dolari pentru o demonstrație în doi ani, ca reclamă la un roman. Nimeni nu i-a cerut.
2013Harald Helfgott demonstrează varianta slabă: orice impar mai mare ca 5 e suma a trei prime. Cea tare rămâne deschisă.
aziVerificată de calculatoare până la 4 · 1018. Niciun contraexemplu. Dar „n-am găsit" nu înseamnă „nu există" — de-asta rămâne conjectură, nu teoremă.
De ce nu e de ajuns să verifici cu calculatorul: numerele pare sunt infinite. Oricât de departe ai ajunge, rămân infinit de multe neverificate. O demonstrație trebuie să le acopere pe toate deodată — și tocmai asta nu știe nimeni să facă.

☄️ Cometa lui Goldbach

Fiecare punct din graficul de mai jos e un număr par. Cât de la stânga la dreapta stă punctul îți spune ce număr e; cât de sus stă îți spune în câte feluri se poate scrie ca sumă de două prime. Apasă pe orice punct ca să vezi exact despre ce număr e vorba.

număr par obișnuit divizibil cu 6 ← dreapta = număr mai mare ↑ sus = mai multe perechi
până la n = 1000
apasă pe un punct din grafic
Ce să observi: punctele nu sunt împrăștiate la întâmplare — se adună în benzi. Banda de sus e a numerelor divizibile cu 6, care au mereu mai multe perechi decât vecinii lor. Iar norul întreg urcă: cu cât numărul e mai mare, cu atât are mai multe descompuneri. Și, oricât de departe ai trage cursorul, niciun punct nu cade pe zero — asta e conjectura lui Goldbach, desenată. Un contraexemplu ar fi un punct lipit de axa de jos.
PROBLEMĂ · 10 puncte

Studiul perechilor Goldbach

Cerința. Se citește un număr natural n. Pentru fiecare număr par de la 4 până la n, afișează câte perechi de numere prime au suma egală cu acel număr.

O pereche se numără o singură dată: 3+7 și 7+3 sunt aceeași pereche. Perechea 5+5 e validă — cele două prime pot fi egale.

Date de intrareUn singur număr natural n. 4 ≤ n ≤ 2200
Date de ieșireCâte o linie pentru fiecare număr par din interval, în ordine crescătoare, în formatul: Numarul K - perechi de prime: X
Exemplu · intrare22
Exemplu · ieșireNumarul 4 - perechi de prime: 1 Numarul 6 - perechi de prime: 1 Numarul 8 - perechi de prime: 1 Numarul 10 - perechi de prime: 2 Numarul 12 - perechi de prime: 1 Numarul 14 - perechi de prime: 2 Numarul 16 - perechi de prime: 2 Numarul 18 - perechi de prime: 2 Numarul 20 - perechi de prime: 2 Numarul 22 - perechi de prime: 3
Copiază formatul exact, inclusiv cratima și spațiile.
⏱ Limită de timp: 5 secunde pe test. Ultimele teste au n mare. Dacă verifici primalitatea împărțind la toate numerele până la x, programul tău va depăși timpul — chiar dacă răspunsul e corect. Folosește ce ai învățat la secțiunea 5: divizor · divizor ≤ x.

⚖ Trimite soluția — 10 teste, câte 1 punct

Alege limbajul, lipește codul și apasă „Verifică". Programul rulează chiar în pagină, pe cele 10 teste, exact ca pe pbInfo.

8

Fișa de sinteză

Uneltele de azi — le vei folosi în fiecare modul de acum înainte.

n % 10 = ultima cifră · n / 10 = numărul fără ultima cifră (împărțire întreagă).
Șablon: cât timp n > 0 → prelucrez n%10 → n = n/10. Rezolvă: sumă, număr, maxim, invers.
Invers: inversul = inversul·10 + ultima_cifra, în buclă. Salvează o copie a lui n dacă îl mai folosești!
Divizorii vin în perechi (divizor, n/divizor) → e suficient să cauți până la √n.
Prim = exact 2 divizori; testezi divizor·divizor ≤ n. 1 nu e prim; 2 e singurul prim par.
Euclid cu împărțiri e drastic mai rapid decât cu scăderi — iar cmmmc(a,b) = a·b / cmmdc(a,b).
Reconstrucție în ordine: nr_nou = ultima_cifra·putere + nr_nou, cu putere·10 la fiecare cifră păstrată — când NU vrei inversarea.
Suma cifrelor: suma = suma + ultima_cifra în buclă — schimbi o singură linie față de invers.
Goldbach: orice par > 2 e suma a două prime — nedemonstrat din 1742. Iar testul de primalitate oprit la √x e diferența dintre 10 puncte și „limită de timp depășită".
Exersează pe pbinfo.ro: „Cifrele unui număr" (suma cifrelor, inversul, palindrom) și „Divizibilitate" (numărul de divizori, prim, cmmdc). Țintă: 10 probleme.
← anteriorModul 02 · Decizie și repetiție urmează →Modul 03a · Generarea de secvențe