Calculation of a combination number without using a factorial method

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Category:

Author: Maros Zatko
Program: C15.PAS

Calculation of a combination number without using a factorial method.
{ C15.PAS                                 Copyright (c) Maros Zatko }
{                                     mail: facebook.zajo@gmail.com }
{ Vypocet kombinancneho cisla bez pouzitia faktorialu.              }
{                                                                   }
{ Datum:23.12.2022                             http://www.trsek.com }
 
program kombinacne_cislo;
 
uses crt;
 
var n,k:word;
 
function cPas(nn,kk:word):longint;
var
  i:word;
  p:longint;
begin
  if nn-kk<kk then
    kk:=nn-kk;
  p:=1;
  for i:=1 to kk do
  begin
    p:=p*nn div i;
    dec(nn);
  end;
  cPas:=p;
end;
 
function cAsm:longint; assembler;
asm
        MOV AX,n   { pouzit Extra registre EAX,EBX,ECX,EDX }
        MOV BX,k   { pouzit CX a DX  do SI:=vysledok }
        SUB AX,BX  { ax:=n-k }
        CMP AX,BX  { porovnanie n-k  k }
        JNB @1
        MOV k,AX   { k:=n-k }
 
@1:     MOV AX,1   { naplnenie registrov hodnotami }
        MOV BX,n
        MOV CX,1
        MOV SI,k
 
@2:     MUL BX     { a teraz uz samotny vypocet }
        JO  @3     { DX:AX >= 65536 }
        DIV CX
        DEC BX
        INC CX
        CMP CX,SI
        JNA @2
        RET
@3:     MOV DX,0   { po preteceni je vysledok nula }
        MOV AX,0   
end;
 
begin
  CRT.clrscr;
 
  n:=49;
  k:=3;    { k:=6;  pre sportku }
 
  writeln('pocet kombinacii (rutina v pas): ',cPas(n,k)); writeln;
  writeln('pocet kombinacii (rutina v asm): ',cAsm);
  readln;
end.