Clasa a XII-a · Matematică pentru programareRead in English
Triunghiul lui Pascal (combinări) în C++
În engleză: Pascal's triangle (combinations)
Ideea
Combinările C(i, j) — numărul de submulțimi cu j elemente ale unei mulțimi cu i elemente — respectă relația C(i, j) = C(i-1, j-1) + C(i-1, j): fie alegem elementul i, fie nu. Cu C(i, 0) = C(i, i) = 1 construim tabelul linie cu linie, folosind doar adunări (fără factoriale care ar depăși). Programul afișează liniile 0, 1, ..., n ale triunghiului, apoi valoarea C(n, k). Pentru n ≤ 66 toate valorile încap în long long.
Descrierea în engleză
The combinations C(i, j), the number of j-element subsets of an i-element set, satisfy C(i, j) = C(i-1, j-1) + C(i-1, j): either we choose element i, or we do not. With C(i, 0) = C(i, i) = 1 we build the table row by row, using only additions (no factorials that would overflow). The program prints rows 0, 1, ..., n of the triangle, then the value C(n, k). For n ≤ 66 all values fit in long long.
- Complexitate
- O(n^2)
- Clasa
- Clasa a XII-a (Grade 12)
- Capitol
- Matematică pentru programare
Exemple
Intrare
5 2
Ieșire așteptată
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 10
Intrare
2 3
Ieșire așteptată
1 1 1 1 2 1 0
Codul C++
Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.
/*
* Titlu: Triunghiul lui Pascal (combinări)
* Clasa: 12
* Capitol: Matematică pentru programare
* Descriere: Combinările C(i, j) — numărul de submulțimi cu j elemente ale unei
* mulțimi cu i elemente — respectă relația C(i, j) = C(i-1, j-1) +
* C(i-1, j): fie alegem elementul i, fie nu. Cu C(i, 0) = C(i, i) = 1
* construim tabelul linie cu linie, folosind doar adunări (fără
* factoriale care ar depăși). Programul afișează liniile 0, 1, ..., n
* ale triunghiului, apoi valoarea C(n, k). Pentru n ≤ 66 toate valorile
* încap în long long.
* Complexitate: O(n^2)
*
* Exemplu
* Intrare: 5 2
* Ieșire:
* 1
* 1 1
* 1 2 1
* 1 3 3 1
* 1 4 6 4 1
* 1 5 10 10 5 1
* 10
*
* Exemplu
* Intrare: 2 3
* Ieșire:
* 1
* 1 1
* 1 2 1
* 0
*/
#include <iostream>
using namespace std;
long long c[67][67];
int main()
{
int n, k;
cin >> n >> k;
for (int i = 0; i <= n; i++)
{
c[i][0] = c[i][i] = 1;
for (int j = 1; j < i; j++)
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
}
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= i; j++)
cout << c[i][j] << (j < i ? ' ' : '\n');
}
// Dacă k > n nu există submulțimi cu k elemente.
cout << (k <= n ? c[n][k] : 0) << '\n';
return 0;
}
Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.