De ce contează?
Dacă îndoi o foaie de hârtie de 1 mm de 10 ori, obții aproape 1 metru. De 42 de ori — ajungi la Lună. Puterile cresc exponențial și depășesc rapid orice limită practică. De aceea, calculul corect al puterii — și gestionarea overflow-ului — este esențial în algoritmică.
Algoritmul simplu
baza^exp = baza × baza × ... × baza, de exp ori. Urmărește pentru 2^5:
rezultat = 1
i=1: rezultat = 1 × 2 = 2
i=2: rezultat = 2 × 2 = 4
i=3: rezultat = 4 × 2 = 8
i=4: rezultat = 8 × 2 = 16
i=5: rezultat = 16 × 2 = 32
Rezultat: 32Implementare C++
#include <iostream>
using namespace std;
int main() {
long long baza;
int exp;
cin >> baza >> exp;
long long rezultat = 1;
for (int i = 1; i <= exp; i++) {
rezultat *= baza;
}
cout << baza << "^" << exp << " = " << rezultat << endl;
return 0;
}Exemple:
- Input
2 10→2^10 = 1024 - Input
3 5→3^5 = 243 - Input
5 0→5^0 = 1
Cazuri speciale
// baza^0 = 1 (bucla nu ruleaza, rezultat = 1 -- corect)
// 0^exp = 0 pentru exp > 0 (1 * 0 * 0 * ... = 0 -- corect)
// 0^0 = 1 prin conventie in C++Algoritmul de față este O(exp) — liniar în exponent. Pentru exp = 10⁹ este prea lent. La clasa a 7-a vei studia exponențierea rapidă (O(log exp)), care calculează puterea în câteva înmulțiri prin pătrat repetat.
Complexitate
| Caz | Timp | Spațiu |
|---|---|---|
| Înmulțiri repetate | O(exp) | O(1) |
Greșeala 1: Inițializezi rezultat = 0 în loc de rezultat = 1. Produsul pornit de la 0 rămâne 0, indiferent de câte înmulțiri faci.
Greșeala 2: Overflow neobservat. int nu ține puteri mari — 2^31 depășește int. Folosește long long și ține cont că și el are limite (~9.2 × 10¹⁸).
Greșeala 3: Scrii baza * exp (înmulțire directă) în loc să ridici la putere. 2 * 10 = 20 ≠ 2^10 = 1024. Ridicarea la putere cere o buclă cu exp pași, nu o înmulțire simplă.
Greșeala 4: Inițializezi rezultat = baza și pornești bucla de la i = 2. Corect pentru exp ≥ 1, dar greșit pentru exp = 0 — obții baza în loc de 1. Forma sigură: rezultat = 1, buclă de la i = 1.