{Nerekurzivni algoritmus: n=rozkladane cislo,
k=delka vektoru,
c=vysledek, a=podle ceho rozkladam;
V pripade nenalezeni rozkladu c=(0,0,0,...,0)}
PROCEDURE Hld1(n,k:INTEGER; VAR c,a:vektor);
VAR i,Delta:INTEGER;
BEGIN
FOR i:=1 TO k DO c[i]:=0;
Delta:=n;
c[k+1]:=1; a[k+1]:=-n-1;
{Zarazka}
i:=k;
WHILE (Delta>0) DO
IF i<>0 THEN BEGIN
c[i]:=Delta DIV a[i];
Delta:=Delta-c[i]*a[i];
i:=PRED(i)
END
ELSE BEGIN
REPEAT i:=SUCC(i)
UNTIL (c[i]<>0);
c[i]:=PRED(c[i]);
Delta:=Delta+a[i];
i:=PRED(i)
END
END;
{Rekurzivni algoritmus: vyznam parametru viz Hld1}
PROCEDURE Hld2(n,k:INTEGER; VAR c:vektor;
a:vektor);
VAR Delta: INTEGER;
FUNCTION Nenalezen(D,i:INTEGER):BOOLEAN;
VAR Nenal: Boolean;
BEGIN
Nenal:=TRUE;
IF (i>0)THEN BEGIN
c[i]:=D DIV a[i];
IF (D=c[i]*a[i])
THEN
Nenal:=FALSE
ELSE
WHILE ((c[i]>=0) AND (Nenal)) DO BEGIN
Nenal:=Nenalezen(D-c[i]*a[i],i-1);
IF Nenal THEN c[i]:=PRED(c[i]);
END;
END;
IF c[i]<0 THEN c[i]:=0;
Nenalezen:=Nenal;
END;
BEGIN
IF Nenalezen(n,k) THEN WRITELN('Rozklad
nenalezen')
END;
{Vypis koeficientu}
PROCEDURE Vypis(n,k:INTEGER; c,a:vektor);
VAR i: INTEGER;
BEGIN
WRITELN('Vycet koeficientu rozkladu cisla
',n);
WRITELN(' hodnota
koeficient');
FOR i:=1 TO k DO
IF (c[i]>0) THEN WRITELN(a[i]:10,c[i]:10);
END;
BEGIN
WRITELN('=========ROZKLAD SUMY DO PLATIDEL
(CELE KC)=========');
FOR i:=1 TO nplatidel DO aa[i]:=platidla[i];
WRITE('Zadej sumu: '); READLN(nn);
{Mozno pouzit take: Hld2(nn,nplatidel,cc,aa);}
Hld1(nn,nplatidel,cc,aa);
vypis(nn,nplatidel,cc,aa);
WRITELN('=========ZJISTI ROZKLAD McNugget-oveho
CISLA=========');
FOR i:=1 TO mnuget DO aa[i]:=nugety[i];
WRITE('Zadej cislo: '); READLN(nn);
{Mozno pouzit take: Hld1(nn,mnuget,cc,aa);}
Hld2(nn,mnuget,cc,aa);
mm:=0;
FOR i:=1 TO mnuget DO mm:=mm+cc[i];
IF mm=0 THEN
WRITELN(nn,' neni McNugget-ove
cislo.')
ELSE vypis(nn,mnuget,cc,aa);
READLN;
END.