PROGRAM to_hop;
USES crt;
VAR n,k:word; C:longint
Functiom gt(a:byte):longint;
var i:byte; kq:longint;
begin
kq:=1;
if a=0 then kq:=1 else for i:=1 to a do kq:=kq*i;
gt:=kq;
end;
BEGIN
clrscr;
repeat
write('Nhap n va k (n > k > 0): '); readln(n,k);
until (n>k) and (k>0);
C:=gt(n)/(gt(k)*gt(n-k));
write('To hop chap k cua n la: ',C);
readln
END.
Bạn cũng có thể viết hàm tính giai thừa và tính tổ hợp chập k của n như sau:
Function gt(a:byte):longint;
begin
if a=1 then gt:=1 else gt:=gt(a-1)*a;
end;
Function C(k,n:byte):longint;
Var
Begin
if (k=0) and (k=n) then C:=1 else
C:=C(k-1,n-1) + C(k,n-1);
End;
Hai hàm trên sử dụng thuật toán đệ quy, tuy thuật toán đơn giản nhưng độ phức tạp tính toán lớn. Bạn cũng có thể tính tổ hợp bằng Quy hoạch động:
Function C(k,n:byte):longint;
Var a:array[0..100,0..100] of longint; i,j:byte;
Begin
for i:=0 to k do
for j:=i to n do
if (i=0) or (i=j) then a[i,j]:=1 else a[i,j] = a[i-1,j-1] + a[i,j-1];
C:=a[n,k];
End;