De ce contează?
Când împachetezi obiecte, alegi cutia după mărime: o cană nu intră într-o cutie de chibrituri, dar nici n-ai pune un inel într-un dulap. La fel alegi tipul unei variabile: destul de mare cât să încapă valoarea, dar fără să irosești spațiu.
Ce este un tip de date
Un tip spune două lucruri: ce fel de valori poate ține o variabilă și cât spațiu ocupă în memorie. Spațiul fixat înseamnă și o limită: dacă depășești limita, valoarea „se sparge" (overflow).
Cele mai folosite tipuri la concursuri:
| Tip | Ce ține | Interval aproximativ | Spațiu |
|---|---|---|---|
int | întregi | −2,1 mld … +2,1 mld | 4 octeți |
long long | întregi mari | ±9,2 · 10¹⁸ | 8 octeți |
char | un caracter / întreg mic | −128 … 127 | 1 octet |
bool | adevărat/fals | true / false | 1 octet |
double | numere reale | ~15 cifre exacte | 8 octeți |
Regula de aur la concurs: dacă rezultatul poate trece de 2 miliarde, folosește
long long. Sumele și produsele cresc rapid — un produs de doar câteva numere de
ordinul miilor depășește deja int.
Cum „arată" un interval
Un int cu semn acoperă valori în jurul lui zero, simetric. Dincolo de capete, urmează
overflow — valoarea sare la celălalt capăt:
-2.1mld | ... | -1 | 0 | 1 | ... | 2.1mld |
Algoritm pas cu pas: când se sparge un int
Calculăm n * (n + 1) / 2 (suma primelor n numere) pentru n = 100000:
n + 1 = 100001n * (n + 1) = 10.000.100.000→ peste 2,1 miliarde!- Dacă
nși produsul suntint, rezultatul e deja greșit înainte de împărțire.
Soluția: facem calculul în long long.
Implementare C++
#include <iostream>
using namespace std;
int main() {
long long n = 100000;
long long suma = n * (n + 1) / 2; // 5000050000, corect
cout << suma << "\n";
int mic = 200;
char litera = 'A';
bool esteImpar = (n % 2 == 1); // false, fiindca 100000 e par
cout << mic << " " << litera << " " << esteImpar << "\n"; // 200 A 0
return 0;
}char litera = 'A'; ține de fapt codul numeric al literei (65 pentru 'A'). De aceea
char e și „număr mic": poți face litera + 1 și obții codul lui 'B'.
Complexitate
Alegerea tipului nu schimbă viteza algoritmului, dar long long ocupă dublu față de
int. La vectori foarte mari (milioane de elemente) asta contează la memorie — folosește
long long doar unde chiar ai nevoie.
Greșeli reale de concurs legate de tipuri:
- Overflow tăcut: calculezi un produs în
int, primești un rezultat „plauzibil" dar greșit, fără niciun mesaj de eroare. Verdict: rezultat parțial. - Conversie prea târzie: scrii
long long s = a * b;cua,bde tipint→ înmulțirea se face tot înintși se sparge înainte de atribuire. Scrie(long long)a * b. doublepentru numărători: rotunjirile dau4.999999în loc de5și pierzi un caz. Pentru întregi folosește tipuri întregi.- Risipă de memorie: un vector de
long longcând valorile încap înintpoate depăși limita de memorie a problemei.
De reținut
- Tipul fixează atât felul valorilor, cât și limita lor — depășirea înseamnă overflow.
- Peste 2 miliarde →
long long; pentru întregi nu folosi niciodatădouble. - Convertește la
long longînainte de înmulțire, nu după.