Calculul combinărilor de n luate câte k (nCk) în C++

Această problemă poate apărea sub mai multor forme:

  • Dându-se două numere naturale nn și kk, să se afle numărul combinărilor de nn luate câte kk: CnkC_n^k.
  • Într-o clasă sunt nn elevi, dintre care doar kk pot fi selectați în echipa clasei de fotbal. Câte modalități de alegere a echipei sunt, știind că ordinea elevilor nu contează?
  • Să se afle coeficientul celui de-al kk-lea termen din binomul (1+x)n(1 + x)^n.

Formula numărului de combinări

Numărul de combinări este egal cu Cnk=n!k!(nk)!C_n^k = \cfrac{n!}{k!(n-k)!}.

Exemplu

Pentru n=5n = 5 și k=3k = 3, avem C53=5!2!3!=12062=12012=10C_5^3 = \frac{5!}{2!3!} = \cfrac{120}{6 \cdot 2} = \cfrac{120}{12} = 10.

Se consideră că pentru k>nk > n, Cnk=0C_n^k = 0.

Calcularea combinărilor (metodă normală)

O metodă obișnuită calculează factorialele celor trei numere dorite — n, k și n - k, după care se afișează formula menționată mai devreme.

Implementare C++

Avem următoarea implementare în C++:

#include <iostream>

using namespace std;

int main()
{
    //Citim și declarăm variabilele n și k
    int n, k;
    cin >> n >> k;

    //Determinăm factorialele dorite
    int factn = 1, factk = 1, factnk = 1; //n!, k! și (n - k)!
    for(int i = 1; i <= factn; i++)
        factn = factn * i;
    for(int i = 1; i <= factk; i++)
        factk = factk * i;
    for(int i = 1; i <= factnk; i++)
        factnk = factnk * i;

    //Calculăm și afișăm numărul de combinări
    int nCk = factn / (factk * factnk);
    cout << nCk;
    return 0;
}

Calcularea combinărilor mai mari

Factorialele cresc foarte repede — 13! nici măcar nu intră în tipul de date int. Desigur, putem să extindem limita folosind tipul de date long long, însă o să întâlnim destul de rapid o limită.

Unele probleme cer răspunsul combinărilor modulo un anumit număr prim. Prin această operație, putem să folosim tipul de date int și totodată să calculăm factoriale imense.

Cu toate acestea, dacă vrem să aflăm cu exactitate numărul, putem să ne folosim de numere mari, prin care în loc să folosim un tip de date pentru a păstra un număr, vom folosi un vector, fiecare element al vectorului conținând câte o cifră.

Soluția cu numere mari este brutală — operațiile sunt extrem de dificil de implementat. Însă, din fericire, acest articol despre Numere Mari explică și exemplifică foarte ușor operațiile cu aceste numere mari.

Bibliografie sau alte resurse

DS

Autorul acestei lecții

Dominic Satnoianu

Această lecție a fost redactată de către Dominic Satnoianu.

© 2021 – 2025 Aspire Education Labs SRL. Toate drepturile rezervate.

Așa cum este specificat și în termeni și condiții, conținutul acestei pagini este protejat de legea drepturilor de autor și este interzisă copierea sau modificarea acestuia fără acordul scris al autorilor.

Încălcarea drepturilor de autor este o infracțiune și se pedepsește conform legii.

Comentarii 0

Autentifică-te pentru a putea comenta.

Autentifică-te