Sari la conținut

Capitolul 6 · Lecția 6.2 din 2

Bucle imbricate și tiparele clasice

For în for: divizori, numere prime și desenarea tiparelor cu stelute.

Capitolul 6: Structuri de controlConținut verificat

Pe scurt pentru BAC · 4 idei

  • Numerele 0 și 1 nu sunt prime, iar optimizarea d * d <= n verifică divizorii doar până la radical.
  • Suma și numărul divizorilor se obțin parcurgând d de la 1 la n și adunând sau numărând fiecare d cu n % d == 0.
  • Pentru n = 12 divizorii sunt 1, 2, 3, 4, 6, 12, deci numărul lor este 6, iar suma 28.
  • Suma a două numere e pară când ambele sunt pare sau ambele sunt impare.
Pe această pagină5 secțiuni

Testul de număr prim

Tiparul care apare constant la BAC:

Verificarea daca un numar e prim

#include <iostream>
using namespace std;

int main() {
    int n = 97;
    int prim = 1;
    if (n < 2) prim = 0;
    for (int d = 2; d * d <= n; d++)
        if (n % d == 0) { prim = 0; break; }
    cout << prim;
    return 0;
}

Atenție: Conditia d*d <= n opreste cautarea la radical. Un divizor mai mare decat radicalul ar avea pereche mai mica, deci ar fi fost gasit deja.

se trimit programului la citire

Optimizarea d * d <= n (verifici doar până la radical) e standard; 1 și 0 NU sunt prime.

Urmărire pentru n = 29: d = 2, 3, 4, 5 (25 ≤ 29), niciun divizor → prim = 1 ✓.

Suma și numărul divizorilor

Suma si numarul divizorilor

#include <iostream>
using namespace std;

int main() {
    int n = 28;
    int s = 0, nr = 0;
    for (int d = 1; d <= n; d++)
        if (n % d == 0) { s += d; nr++; }
    cout << s << " " << nr;
    return 0;
}

Atenție: Pentru 28 suma divizorilor e 56, adica dublul numarului. Astfel de numere se numesc perfecte.

se trimit programului la citire

Pentru n = 12: divizorii 1, 2, 3, 4, 6, 12 → nr = 6, s = 28.

Bucle imbricate: numărarea perechilor

Câte perechi (i, j) cu 1≤i<j≤n1 \le i < j \le n au suma pară?

Perechi cu suma para

#include <iostream>
using namespace std;

int main() {
    int n = 6;
    int nr = 0;
    for (int i = 1; i < n; i++)
        for (int j = i + 1; j <= n; j++)
            if ((i + j) % 2 == 0) nr++;
    cout << nr;
    return 0;
}

Atenție: Bucla interioara porneste de la i+1, nu de la 1. Asa fiecare pereche e numarata o singura data si nu apar perechi cu acelasi element.

se trimit programului la citire

Pentru n = 4: perechile (1,3), (2,4) → nr = 2. Regula: suma pară = ambele pare sau ambele impare.

Numărul de pași la bucle imbricate

Tabla inmultirii

#include <iostream>
using namespace std;

int main() {
    int n = 4;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++)
            cout << i * j << " ";
        cout << "\n";
    }
    return 0;
}
se trimit programului la citire

execută corpul de n2n^2 ori; cu j = i + 1 la start: n(n−1)2\dfrac{n(n-1)}{2} ori (perechile). La subiectul cu "de câte ori se execută", astea două formule acoperă majoritatea cazurilor.

Atenție

"break" iese DOAR din bucla curentă (cea interioară), nu din toate. La urmărire, notează exact ce buclă se întrerupe.

Reține

Test de prim: n < 2 nu e prim, apoi cauți divizori d cât timp d * d <= n. Bucla dublă cu j de la 1 la n execută corpul de n2n^2 ori; cu j pornind de la i + 1, de n(n−1)2\dfrac{n(n-1)}{2} ori. break iese doar din bucla în care se află.

Greșeli frecvente

  1. Testul de prim fără cazul n < 2: 1 nu e prim.
  2. La perechi cu i < j, bucla interioară pornește de la i + 1, nu de la 1 (altfel numeri dublu).
  3. d * d <= n, nu d <= n / 2: a doua e corectă dar mai lentă și diferă la urmărire.

Instrumente pentru lecția asta

Divizori și numere prime

Descompunerea în factori primi și divizorii comuni, vizual: fundamentul algoritmilor cu divizori de la BAC.

Se încarcă instrumentul…

Bifează când ai terminat, ca s-o vezi citită pe toate dispozitivele.

Testează-te pe capitolul 6

Lecția în clipuri

Clipuri scurte, cu voce și subtitrări.

Folosim cookie-uri esențiale, fără de care site-ul nu merge, și cookie-uri de analiză anonimizate, ca să vedem ce pagini ajută. Detalii în politica de confidențialitate