d de la 1 la n, simplu de scrisif(n%d==0)Divizori, test de primalitate, factori primi, cel mai mare divizor comun și cel mai mic multiplu comun. Tipurile de item de la Subiectul I, II.1 și III.1, rezolvate pe lucrări oficiale.

ții minte doar fișa asta și ești acoperit
Divizor: n%d==0. Perechea lui d este n/d.
Prim: n>=2 și niciun d cu d·d<=n care să dividă n.
Truc: 0 și 1 nu sunt prime. 2 e prim.
Euclid cu rest: while(y!=0) { r=x%y; x=y; y=r; } Rezultatul e în x.
Euclid cu scăderi: while(x!=y) if(x>y) x=x-y; else y=y-x; Merge doar pentru numere nenule.
Cmmmc: x0·y0/cmmdc. Păstrează valorile inițiale, pentru că algoritmul le schimbă.
Factori primi: împarți cât timp se poate, apoi treci la d următor. Dacă la final n≠1, ce a rămas e prim.
Culorile din lecție:termencifră, datăidee-cheie
n%d==0 înseamnă că d îl divide pe n. Pe asta se construiesc toate problemele din lecție.d*d<=n.Când împarți 36 la 3, restul e 0, deci 3 e divizor al lui 36. Când îl găsești pe 3, l-ai găsit și pe 12, adică 36/3. Divizorii vin în perechi, iar din fiecare pereche, cel mic e cel mult radicalul lui n.
s=0;
for(d=1;d*d<n;d++)
if(n%d==0)
s=s+d+n/d;
if(d*d==n) s=s+d;
Secvența calculează suma divizorilor. Ultima linie tratează pătratele perfecte: la 36, divizorul 6 trebuie adunat o singură dată.
Oficial: la BAC 2021, sesiunea august, SN, I.5, se cere exact expresia care completează s=s+....., iar răspunsul e i+n/i (varianta c, 4 p). În lucrarea din iulie 2024, varianta 3, III.1, enunțul definește divizorii proprii ca divizorii naturali „diferiți de 1 și de el însuși”. Citește mereu definiția din enunț: ea decide dacă numeri 1 și n.
d de la 1 la n, simplu de scrisif(n%d==0)d până la radicald și n/dif(x%d==0 && y%d==0)z=d;| Sarcină | Ce faci | Cod |
|---|---|---|
| Toți divizorii | d de la 1 la n, simplu de scris | if(n%d==0) |
| Divizori în perechi | d până la radical | d și n/d |
| Divizor comun | ambele resturi nule | if(x%d==0 && y%d==0) |
| Cel mai mare divizor comun, simplu | ultimul găsit în ordine crescătoare | z=d; |
Ultima linie e chiar BAC specială 2024, SN, I.4: bucla for(d=1;d<=x;d++) cu z=d pe ramura comună lasă în z cel mai mare divizor comun (varianta b, 4 p).
Un număr e prim dacă are exact doi divizori naturali. Cauți un divizor între 2 și radical. Dacă nu există, numărul e prim.
ok=1;
if(n<2) ok=0;
for(d=2;d*d<=n;d++)
if(n%d==0) ok=0;
if(n%2==0)
if(n==2) ok=1;
else ok=0;
else
{ d=......; ok=1;
while(ok==1 && d*d<=n)
if(n%d==0) ok=0;
else d=d+2;
}
Se cere constanta cu care ok devine 1 doar dacă n e prim. Răspunsul e 3 (varianta d, 4 p). Numerele pare au fost tratate deja, deci sunt suficienți divizorii impari: 3, 5, 7... Cu d=1, n%1 e mereu 0, iar ok ar deveni 0 pentru orice număr impar. Cu d=2, s-ar verifica doar 2, 4, 6..., iar 9 ar ieși prim.
Un detaliu pe care enunțul nu îl spune: pentru n=1, bucla nu rulează, iar ok rămâne 1. Enunțul cere „dacă și numai dacă numărul e prim”, iar secvența e cea dată, deci răspunsul din barem rămâne d. În programele tale, tratează separat n<2.
Cu ce valoare începe d la testul de primalitate pentru numere impare?
Împarți cât timp se poate la d, apoi treci la d+1. Când ajungi la un d care îl divide pe n, el e sigur prim: divizorii lui mai mici au fost scoși deja.
citește n (număr natural nenul)
nr←0; d←2
┌cât timp d*d≤n execută
│ p←0
│┌cât timp n%d=0 execută
││ p←1; n←[n/d]
│└■
│ nr←nr+p; d←d+1
└■
┌dacă n≠1 atunci
│ nr←nr+1
└■
scrie nr
6*6 depășește 13, se iese din buclă| d | Ce se întâmplă | n după | nr |
|---|---|---|---|
| 2 | 2600 se împarte de 3 ori la 2 | 325 | 1 |
| 3, 4 | nu divid | 325 | 1 |
| 5 | 325 se împarte de 2 ori la 5 | 13 | 2 |
| 6 | 6*6 depășește 13, se iese din buclă | 13 | 2 |
La final n=13, deci nr crește: se afișează 3 (6 p). Algoritmul numără factorii primi distincți: 2, 5 și 13. La b) se cer două numere din [10,99] pentru care se afișează 1 (3 p fiecare). Baremul acceptă orice putere a unui număr prim, de forma x la k cu k>0, de exemplu 16 sau 25.
Același tipar, la rezerva din 2025, varianta 7, MI, II.1, reține ultimul factor prim și produsul factorilor distincți: pentru 252 se afișează 7 42 (3 p pentru fiecare valoare).
Ai două bare, de 12 și de 18. Vrei cea mai lungă unitate cu care se măsoară exact amândouă. Dacă unitatea le măsoară pe amândouă, măsoară și diferența lor, 6. Așa poți înlocui bara mare cu ce rămâne din ea.
while(y!=0) { r=x%y; x=y; y=r; }xwhile(x!=y) if(x>y) x=x-y; else y=y-x;x și în y| Forma | Cod | Rezultatul |
|---|---|---|
| Cu rest | while(y!=0) { r=x%y; x=y; y=r; } | în x |
| Cu scăderi | while(x!=y) if(x>y) x=x-y; else y=y-x; | în x și în y |
Forma cu rest, pentru 1000 și 2025
x=1000, y=2025
r=1000
x=2025, y=1000
r=25
x=1000, y=25
r=0
x=25, y=0
rezultatul e în x
Forma cu rest funcționează și când x<y: primul pas doar schimbă valorile între ele. Forma cu scăderi nu se termină dacă una dintre valori e 0 și cealaltă nu.
r=....; în while(y!=0), pentru x=1000, y=2025x%y (a)x după scăderile pornite cu x=2025, y=280if(.........) x=x-y;, pentru 50 și 2020x-y>0 (d)z=x*y înainte de bucla cu scăderi, ce dă cmmmcz/y (c)| Lucrare | Se cere | Răspuns |
|---|---|---|
| Simulare 2025, I.4 | ce înlocuiește punctele din r=....; în while(y!=0), pentru x=1000, y=2025 | x%y (a) |
| Model 2025, I.5 | ce reprezintă x după scăderile pornite cu x=2025, y=280 | cmmdc (d) |
| Simulare 2021, I.5 | condiția din if(.........) x=x-y;, pentru 50 și 2020 | x-y>0 (d) |
| August 2026, I.5 | cu z=x*y înainte de bucla cu scăderi, ce dă cmmmc | z/y (c) |
Ultimul rând se bazează pe relația cmmmc(x,y)=x*y/cmmdc(x,y). Produsul se calculează înainte de buclă, pentru că bucla schimbă x și y.
citește m,n (numere naturale, 1<m<n)
┌repetă
│ x←m; y←n; n←n-1
│┌repetă
││┌dacă x>y atunci x←x-y
│││altfel y←y-x
││└■
│└până când y=0
└până când x≠1
scrie n+1
Pentru 27 și 38 se afișează 36 (6 p). Bucla interioară e Euclid cu scăderi: când x și y devin egale, y←y-x îl face pe y 0, iar x rămâne cmmdc-ul. Bucla exterioară coboară de la n până la primul număr care nu e prim cu m. 38 și 37 sunt prime cu 27, iar cmmdc(27,36)=9. Pentru m=5 și rezultatul 10, baremul acceptă orice n din [10,14] (3 p fiecare).
Ce valoare are cmmmc(40,20,30)?
După while(x!=y) cu scăderi, unde e cmmdc-ul?
Un raft are trei polițe, de lățimi x, y, z din [10,100]. Pe fiecare se pun cuburi cu latura egală cu lățimea poliței, iar polița trebuie umplută complet. Se cere lungimea minimă a poliței. Pentru 40, 20, 30, răspunsul e 120.
Dacă treci prin povestea din enunț, rămâne: un număr divizibil cu x, y și z, cât mai mic. Adică cel mai mic multiplu comun. Numele subprogramului este depozit.
int depozit(int x,int y,int z)
{ int L=x;
while(L%y!=0 || L%z!=0)
L=L+x;
return L;
}
Pornești de la x și mergi din x în x, deci L e mereu multiplu de x. Primul care e divizibil și cu y și cu z e cel mai mic. Valoarea nu depășește 100*100*100, deci încape în int.
Barem MI (10 p)Puncte
| Barem MI (10 p) | Puncte |
|---|---|
| antet: structură, parametri de intrare | 2 |
| lungimea determinată, câte 2 p: multiplu sau divizor al unui număr, multiplu comun a două numere, cel mai mic multiplu comun | 6 |
| returnare | 1 |
| variabile locale, corectitudine globală | 1 |
La științele naturii se cere aceeași problemă, în pseudocod, la aceeași sesiune.
Un teren de x pe y se împarte în parcele pătrate cu latură naturală. Pentru fiecare variantă se scrie numărul de parcele, apoi latura. Pentru 18 și 24: 432 cu latura 1;108 cu latura 2;48 cu latura 3;12 cu latura 6;.
Latura trebuie să dividă și lățimea, și lungimea, deci e divizor comun. Parcele sunt x/d pe un rând și y/d pe celălalt.
void parcele(int x,int y)
{ int d;
for(d=1;d<=x && d<=y;d++)
if(x%d==0 && y%d==0)
{ cout<<(x/d)*(y/d);
cout<<" cu latura "<<d<<";";
}
}
Barem MI (10 p)Puncte
| Barem MI (10 p) | Puncte |
|---|---|
| antet: structură cu nume și tip rezultat, parametri de intrare | 2 |
| valori determinate; la rezolvare parțială, câte 1 p: divizor al unui număr, divizor comun, divizor complementar, divizori comuni analizați | 5 |
| afișare; numai 1 p dacă valorile sunt bune, dar nu în formatul cerut | 2 |
| variabile locale, corectitudine globală | 1 |
La științele naturii, aceeași problemă se scrie în pseudocod, cu barem de 10 p: citire 1, valori 5, scriere 2, structuri de control și corectitudine 2.
O broșură are p pagini, cu p prim, iar catalogul are 3*p pagini. Subprogramul pagini primește n din [2,10⁴] și returnează 1 dacă toate cele n pagini formează un astfel de set. Pentru 44 răspunsul e 1 (11+33), iar pentru 48 sau 27 e 0.
Totalul e p+3*p=4*p. Deci n trebuie să fie multiplu de 4, iar n/4 să fie prim.
int pagini(int n)
{ int p,d;
if(n%4!=0) return 0;
p=n/4;
if(p<2) return 0;
for(d=2;d*d<=p;d++)
if(p%d==0) return 0;
return 1;
}
Barem: antet 2 p; proprietate verificată 6 p, câte 1 p pentru identificarea unui divizor, algoritmul de numărare sau verificare, divizorii analizați pentru număr prim, cazul n=4, multiplu de 4, asocierea celor două condiții; returnare 1 p; variabile locale și corectitudine globală 1 p.
n e produs de două numere prime consecutivea și b| Lucrare | Item | Cerința |
|---|---|---|
| August 2024 var. 8, MI și SN | III.1 | n e produs de două numere prime consecutive |
| Iulie 2024 var. 3, MI | III.1 | cel mai mic număr dintr-un interval cu suma divizorilor proprii impari mai mare decât a celor pari |
| Sesiunea specială 2025 var. 6, MI | III.1 | cel mai mare divizor care e pătrat perfect |
| August 2025 var. 4, MI | III.1 | divizorii ariei, afișați în perechi cu condiții |
| Model 2024, MI | III.1 | produsul divizorilor comuni ai lui a și b |
| Iunie 2020 var. 6, MI și SN | III.1 | suma divizorilor comuni |
d*d<n la testul de primalitate: 25 și 49 ies prime. Condiția corectă e d*d<=n.x și y folosiți după Euclid, când au alte valori.x*y înainte de a verifica domeniul: la valori mari, produsul poate depăși int.