Factorial și ridicare la putere
În multe probleme avem nevoie să calculăm expresii matematice precum:
5! = 1 × 2 × 3 × 4 × 5 = 1202^10 = 1024
Ambele se bazează pe înmulțiri repetate și
se rezolvă ușor cu o buclă for.
Ce este factorialul?
Factorialul unui număr natural
n, notat n!, este produsul tuturor
numerelor naturale de la 1 la n.
n! = 1 × 2 × 3 × ... × n
Cazuri speciale:
0! = 1(prin convenție)1! = 1
Exemple
| n | n! |
|---|---|
| 0 | 1 |
| 1 | 1 |
| 2 | 2 |
| 3 | 6 |
| 4 | 24 |
| 5 | 120 |
| 6 | 720 |
| 10 | 3628800 |
Calculul factorialului
Ideea:
- pornim cu un produs egal cu
1; - înmulțim pe rând cu
1, 2, 3, ..., n.
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int factorial = 1;
for (int i = 1; i <= n; i++) {
factorial = factorial * i;
}
cout << factorial;
return 0;
}Input:
5Output:
120Pas cu pas pentru
n = 5
| Pas | i | factorial |
|---|---|---|
| start | - | 1 |
| 1 | 1 | 1 × 1 = 1 |
| 2 | 2 | 1 × 2 = 2 |
| 3 | 3 | 2 × 3 = 6 |
| 4 | 4 | 6 × 4 = 24 |
| 5 | 5 | 24 × 5 = 120 |
Atenție: factorialul crește foarte repede!
13! = 6227020800, care depășește limita lui
int. Pentru n >= 13, trebuie
folosit long long.
Factorialul cu
long long
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
long long factorial = 1;
for (int i = 1; i <= n; i++) {
factorial = factorial * i;
}
cout << factorial;
return 0;
}Input:
15Output:
1307674368000
Până la cât merge long long?
Tipul long long poate stoca valori de până la
aproximativ 9.2 × 10^18.
Factorialul 20! = 2432902008176640000 încă
încape, dar 21! deja depășește.
Deci cu long long putem calcula factorialul până
la n = 20.
Ridicarea la putere
Ridicarea la putere înseamnă să înmulțim o
bază b cu ea însăși de n ori:
b^n = b × b × b × ... × b(denori)
Cazuri speciale:
b^0 = 1(orice număr la puterea 0 este 1)b^1 = b
Exemple
| b | n | b^n |
|---|---|---|
| 2 | 0 | 1 |
| 2 | 5 | 32 |
| 3 | 4 | 81 |
| 10 | 3 | 1000 |
| 5 | 3 | 125 |
Calculul puterii
#include <iostream>
using namespace std;
int main()
{
int b, n;
cin >> b >> n;
long long putere = 1;
for (int i = 1; i <= n; i++) {
putere = putere * b;
}
cout << putere;
return 0;
}Input:
2 10Output:
1024Pas cu pas pentru
b = 2, n = 5
| Pas | i | putere |
|---|---|---|
| start | - | 1 |
| 1 | 1 | 1 × 2 = 2 |
| 2 | 2 | 2 × 2 = 4 |
| 3 | 3 | 4 × 2 = 8 |
| 4 | 4 | 8 × 2 = 16 |
| 5 | 5 | 16 × 2 = 32 |
Ultima cifră a unei puteri
O problemă frecventă: care este ultima cifră
a lui b^n?
Nu trebuie să calculăm toată puterea (ar fi uriașă). La fiecare pas, păstrăm doar ultima cifră:
#include <iostream>
using namespace std;
int main()
{
int b, n;
cin >> b >> n;
int ultima = 1;
for (int i = 1; i <= n; i++) {
ultima = (ultima * b) % 10;
}
cout << ultima;
return 0;
}Input:
7 100Output:
1
De ce funcționează % 10?
Ultima cifră a unui produs depinde doar de ultimele cifre ale factorilor.
De exemplu: 123 × 456 - ultima cifră este
3 × 6 = 18, adică 8.
Dacă la fiecare pas păstrăm doar ultima cifră
(% 10), rezultatul final este corect și evităm
depășirea.
Combinarea:
n! are ultima cifră…
Pentru n >= 5, factorialul conține factorul
2 × 5 = 10, deci n! se termină cu
0.
Dar pentru n < 5, putem calcula:
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int ultima = 1;
for (int i = 1; i <= n; i++) {
ultima = (ultima * i) % 10;
}
cout << ultima;
return 0;
}Input:
4Output:
4Explicație: 4! = 24, ultima cifră este
4.
Greșeli frecvente
1. Inițializarea
produsului cu 0
int factorial = 0; // GREȘITDacă pornim de la 0, orice înmulțire va da
0. Produsul trebuie inițializat cu
1.
2. Depășirea la factorial
13! depășește int. Folosește
long long dacă n poate fi mai mare de
12.
3. Confuzia între factorial și putere
- Factorial:
5! = 1 × 2 × 3 × 4 × 5- înmulțim numerele de la 1 la n - Putere:
2^5 = 2 × 2 × 2 × 2 × 2- înmulțim baza cu ea însăși de n ori
4. Uitarea cazului
n = 0
Atât 0! = 1 cât și b^0 = 1. Bucla
for de la 1 la 0 nu se
execută, deci rezultatul rămâne 1 - ceea ce este
corect.
Ce să reții
- Factorialul:
n! = 1 × 2 × ... × n. Se calculează cu unforși un produs care pornește de la1. - Puterea:
b^n = b × b × ... × b. Aceeași idee, dar înmulțim mereu cub. - Produsul se inițializează cu
1, niciodată cu0. - Folosește
long longpentru valori mari. - Pentru ultima cifră, aplică
% 10la fiecare pas.