Calculatorul nu se plictisește niciodată: poate repeta aceeași operație de un miliard de ori fără să greșească. Ca să profiți de asta, ai nevoie de structuri repetitive (bucle). Cu ele aduni cifrele unui număr, cauți divizori, verifici dacă un număr este prim sau prelucrezi un șir întreg de valori. La BAC, aproape fiecare subiect de informatică conține cel puțin o buclă de urmărit „pe hârtie” sau de scris.
Instrucțiunea while
while (conditie)
{
instructiuni;
}
Se evaluează condiția; dacă este adevărată, se execută corpul și se revine la testare. Bucla se oprește când condiția devine falsă. Este o structură cu test inițial: dacă de la început condiția este falsă, corpul nu se execută deloc.
Corpul trebuie să modifice ceva din condiție. Altfel obții o buclă infinită.
Instrucțiunea do-while
do
{
instructiuni;
} while (conditie);
Este o structură cu test final: corpul se execută o dată, apoi se testează condiția. Prin urmare, corpul se execută cel puțin o dată. Atenție la ; după while (conditie).
Instrucțiunea for
for (int i = 1; i <= n; i++)
{
instructiuni;
}
Are trei părți: inițializarea (int i = 1, o singură dată), condiția (testată înainte de fiecare pas) și actualizarea (i++, după fiecare pas). Se folosește când știi de câte ori repeți: bucla de mai sus are exact pași. Orice for se poate rescrie cu while.
Algoritmi cu cifrele unui număr
Toți folosesc aceeași idee: iei ultima cifră cu n % 10 și o elimini cu n / 10, până când n devine .
| problemă | inițializare | la fiecare pas |
|---|---|---|
| suma cifrelor | s = 0 | s = s + n % 10; |
| numărul de cifre | c = 0 | c++; |
| oglinditul (inversul) | inv = 0 | inv = inv * 10 + n % 10; |
| produsul cifrelor | p = 1 | p = p * (n % 10); |
Pentru numărul de cifre folosește do-while, ca să fie numărat corect ca număr cu o cifră.
Divizori, numere prime și cmmdc
Divizorii lui : d este divizor dacă n % d == 0. Divizorii vin în perechi , de aceea este suficient să parcurgi d cât timp d * d <= n.
Număr prim: are exact doi divizori, pe și pe el însuși. Numerele și nu sunt prime.
Algoritmul lui Euclid pentru , prin împărțiri repetate:
while (b != 0)
{
int r = a % b;
a = b;
b = r;
}
// acum a este cmmdc-ul
Apoi , calculat cu valorile inițiale ale lui și .
Exemple rezolvate
Exemplul 1: oglinditul unui număr
Pentru n = 1203, urmărim secvența inv = 0; while (n > 0) { inv = inv * 10 + n % 10; n = n / 10; }:
| pas | n % 10 | inv | n după pas |
|---|---|---|---|
| 1 | 3 | 3 | 120 |
| 2 | 0 | 30 | 12 |
| 3 | 2 | 302 | 1 |
| 4 | 1 | 3021 | 0 |
Rezultatul este . Un număr este palindrom dacă este egal cu oglinditul lui, de exemplu ; pentru test, păstrează valoarea inițială într-o copie, pentru că bucla îl aduce pe n la .
Exemplul 2: verificarea unui număr prim
int n, prim = 1;
cin >> n;
if (n < 2) prim = 0;
for (int d = 2; d * d <= n; d++)
if (n % d == 0) prim = 0;
cout << (prim ? "DA" : "NU");
Pentru se găsește divizorul (), deci se afișează NU. Pentru se testează (pentru că ), niciun nu îl divide, deci se afișează DA.
Exemplul 3: cmmdc și cmmmc
Pentru și , algoritmul lui Euclid dă perechile
deci și . Observă că, dacă , primul pas doar interschimbă numerele.
Greșeli frecvente
- Bucla infinită. În
while (n > 0) { s = s + n % 10; }lipseșten = n / 10;, decinnu scade niciodată. ;dupăforsauwhile.for (i = 1; i <= n; i++);are corpul vid: instrucțiunea următoare se execută o singură dată, după buclă.- Numărul la cifre. Cu
while (n > 0), numărul pare să aibă cifre. Foloseștedo-whilepentru numărarea cifrelor. - Valoarea inițială pierdută. După o buclă care împarte
nla ,neste . Dacă îți mai trebuie, salvează-l înainte. - considerat prim. Un număr prim are exact doi divizori distincți; are unul singur.
- Numărarea pașilor.
for (i = 1; i < n; i++)are pași, nu . Verifică mereu prima și ultima valoare a contorului.
Pe scurt
whiletestează condiția înainte de corp,do-whiledupă corp (corpul rulează cel puțin o dată), iarforeste potrivit când știi numărul de pași.- Cifrele unui număr se prelucrează cu
n % 10(ultima cifră) șin / 10(eliminarea ei), până la . ddividendacăn % d == 0; pentru numere prime este suficient să testezi divizorii cud * d <= n.- Algoritmul lui Euclid calculează cmmdc-ul prin resturi repetate; cmmmc-ul este produsul împărțit la cmmdc.