Lecție pentru bacalaureat · Informatică

Divizibilitate, numere prime și c.m.m.d.c.

Clasa a IX-a

Ideile de bază pe scurt și, unde există, exercițiile din subiectele de BAC care le verifică. Lecția completă, animată, cu grile și exerciții corectate, e în aplicația Tomomi.

Pe scurt

Formulă

Sintaxă: testul de divizibilitate (n % d == 0)

Bucla care vizitează toți divizorii lui n, de la 1 la el însuși:

pentru d ← 1, n execută
    dacă n mod d = 0 atunci
        scrie d
    ■
■
for (int d = 1; d <= n; d++) {
    if (n % d == 0) {
        // d este divizor
    }
}
Idee

Idee: divizorii vin în perechi

Dacă d divide n, atunci și n / d divide n: divizorii lui 12 sunt perechile (1, 12), (2, 6), (3, 4). Consecință utilă: orice divizor mai mare ca radicalul are perechea sub radical, deci multe căutări se pot opri la d * d <= n. Pătratele perfecte au un divizor singuratic (6 pentru 36), de aceea au număr impar de divizori.

Formulă

Șablon: testul de primalitate

Fanion care rămâne 1 doar dacă nu există divizor propriu până la radical:

ok ← 1
dacă n < 2 atunci
    ok ← 0
■
d ← 2
cât timp d * d ≤ n execută
    dacă n mod d = 0 atunci
        ok ← 0
    ■
    d ← d + 1
■
int ok = 1;
if (n < 2) {
    ok = 0;
}
for (int d = 2; d * d <= n; d++) {
    if (n % d == 0) {
        ok = 0;
    }
}
Sfat

Capcana: pătratele perfecte la d * d < n

Cu condiția strictă d * d < n, bucla nu testează niciodată d = radical(n): 25 ar ieși prim, pentru că d = 5 nu e încercat (5·5 = 25 nu e < 25). Scrie mereu d * d <= n. La fel de important: n < 2 trebuie tratat separat, altfel 0 și 1 trec ca prime.

Formulă

Șablon: algoritmul lui Euclid

Prin împărțiri (rapid) și prin scăderi repetate (clasic):

cât timp b ≠ 0 execută
    r ← a mod b
    a ← b
    b ← r
■
while (b != 0) {
    int r = a % b;
    a = b;
    b = r;
}
// răspunsul este a
Sfat

Capcana: Euclid își distruge variabilele

După bucla lui Euclid, b este 0 și a este c.m.m.d.c.: valorile inițiale s-au pierdut. Dacă mai ai nevoie de ele (de exemplu la cmmmc = a * b / cmmdc), salvează copii înainte de buclă:

int x = a;
int y = b;
while (y != 0) {
    int r = x % y;
    x = y;
    y = r;
}
// x = cmmdc; a și b sunt neatinse

Toate lecțiile de Informatică

Descarcă

Începe azi. Bacul nu așteaptă.

Descarcă Tomomi pe telefonul copilului tău și pornește perioada de probă gratuită.