De ce contează?
Când împachetezi pentru o excursie, alegi bagajul după CE duci: un rucsac pentru o zi, o valiză pentru o săptămână, o ladă frigorifică pentru mâncare. Nu iei lada frigorifică la o plimbare de o oră, dar nici nu înghesui haine de o săptămână într-o borsetă. La fel alegi tipul unei variabile: te uiți întâi la ce vrei să pui în ea, abia apoi alegi „recipientul". Un tip prea mic varsă pe lângă (overflow); unul prea mare risipește, dar e cel mai mic dintre rele.
Ideea-cheie
Ai învățat deja patru recipiente: int, long long, double și char. Lecția asta nu adaugă un al cincilea — te învață cum alegi între ele.
Regula e una singură și se aplică mereu în aceeași ordine:
Întâi întreabă-te CE pui în variabilă și cât de mare poate ajunge, abia apoi alegi tipul.
Aproape toți elevii fac invers: scriu int din reflex, rulează, iar la testul ascuns cu numere mari programul dă un rezultat absurd. Nu pentru că au greșit algoritmul — ci pentru că au ales recipientul fără să se uite ce torn în el.
Tipul nu se alege după ce variabilă „arată bine", ci după valoarea maximă pe care o poate atinge. Dacă nu știi cât de mare poate ajunge un rezultat, nu poți alege corect tipul. De aceea reflexul cheie e: estimează maximul mai întâi.
Cum alegi
Patru întrebări, în ordine. Te oprești la prima care se potrivește.
1. Este o valoare cu zecimale (măsurată, fracționară)? → double
Medie, procent, distanță, rezultatul unei împărțiri reale. int ar tăia partea zecimală: media lui 7 și 8 nu e 7, e 7.5.
2. Este un singur caracter sau un truc cu codul ASCII? → char
O literă, o cifră privită ca simbol, o săgeată '>'. char ține un caracter și codul lui din tabelul ASCII ('A' are codul 65).
3. Este un întreg care poate depăși ~2 miliarde? → long long
int ține în siguranță până la aproximativ 2 * 10^9 (puțin peste 2 miliarde). Orice sumă, produs sau rezultat care poate trece de pragul ăsta cere long long (până la circa 9 * 10^18).
4. Altfel — un întreg „normal" → int
Numărători, indici de vector, valori citite care sunt clar sub 2 miliarde. E cazul cel mai des întâlnit.
Pasul care decide totul: estimează maximul
Întrebarea grea e mereu a treia. Ca s-o rezolvi, calculezi pe hârtie cel mai mare rezultat POSIBIL, nu cel din exemplul mic dat în enunț. Hai pe exemple concrete.
Exemplul 1 — suma a multe numere mari.
„Aduni n valori, cu n până la 100000, fiecare până la 10^9."
Maximul sumei: 100000 * 10^9 = 10^14. Asta e 100000 de miliarde — mult peste pragul lui int (~2 * 10^9). Deci suma trebuie ținută în long long. Atenție: chiar dacă fiecare valoare în parte încape lejer într-un int, suma lor nu încape.
long long suma = 0; // nu int: 10^14 depaseste limita int
int x;
for (int i = 0; i < n; i++) {
cin >> x; // fiecare x incape in int
suma += x; // dar suma poate ajunge la 10^14
}Exemplul 2 — produsul a două numere.
„Înmulțești două laturi, fiecare până la 50000."
Maximul produsului: 50000 * 50000 = 2.5 * 10^9 — chiar peste 2 * 10^9. Iar int * int se calculează ca int și se strică ÎNAINTE să apuci să salvezi rezultatul. Soluția: măcar un operand să fie long long.
long long arie = (long long)a * b; // forteaza inmultirea pe long longExemplul 3 — numeri câte elemente sunt pare.
„Câte numere dintr-un vector de 100000 de elemente sunt pare?"
Maximul răspunsului: 100000. Minuscul. Aici long long ar fi risipă — int e alegerea corectă. O numărătoare rămâne mică, oricât de mari ar fi numerele numărate.
Exemplul 4 — media notelor.
„Calculezi media a trei note."
Rezultatul are zecimale ((8 + 9 + 10) / 3 = 9.0, dar (7 + 8 + 8) / 3 = 7.66...). Răspunsul nu mai e întreg → double. Dacă l-ai ține în int, ai pierde tocmai partea care contează.
Observă tiparul: în toate cele patru cazuri nu te-ai uitat la cum sună problema, ci la cât de mare (sau ce fel de) număr produce. Asta e tot ce face un programator experimentat — calculează maximul din cap înainte să scrie tipul.
Capcana numărul unu din concursuri: declari int suma și aduni multe numere mari. La testele mici totul merge, dar la n = 100000 și valori de 10^9 suma ajunge la 10^14, depășește limita lui int și „se învârte" în negativ (overflow) — primești un rezultat ca -1294967296. Algoritmul tău era corect; tipul nu. Reflexul care te salvează: înainte să scrii int, întreabă-te „cât de mare poate ajunge ASTA?". Dacă răspunsul trece de 2 miliarde, pui long long.