Registriert seit: 17. Nov 2005
Ort: Hamburg
1.064 Beiträge
Delphi XE2 Professional
|
Re: n über k - berechnen!?
15. Jan 2010, 21:53
Ich hab das vor langer Zeit mal so gelöst, würde das heute aber etwas anders machen.
Delphi-Quellcode:
FUNCTION Combinations( const n,k:extended):extended;
const maxk=32767;
var r1,r2:extended; i,kk,nn,len:integer; ok:boolean;
list: array of integer;
//------------------------------------------------------------------------------
FUNCTION CheckDivisible( var n:integer; k:integer):boolean; register;
asm
push ebx
mov ebx,eax
mov eax,[ebx]
mov ecx,edx
xor edx,edx
div ecx
or edx,edx
jne @1
mov [ebx],eax
@1: sete al
pop ebx
end;
//------------------------------------------------------------------------------
begin
if (k>n) then begin
result:=0;
end else if (k=n) or (k=0) then begin
result:=1;
end else if (k>maxk) then begin
result:=NaN;
end else begin
nn:=Trunc(n);
len:=Trunc(k);
SetLength(list,len);
r1:=1;
r2:=1;
// alle n in Liste
for i:=0 to len-1 do begin
list[i]:=nn;
Dec(nn);
end;
ok:=true; // damit der Compiler nicht meckert
// alle k gegen n aus liste kürzen, ggfs. in r1 aufmultiplizieren
for kk:=len downto 2 do begin
for i:=0 to len-1 do begin
ok:=CheckDivisible(list[i],kk);
if ok then break;
end;
if not ok then r1:=r1*kk;
end;
// alle n aus Liste in r2 aufmultiplizieren
for i:=0 to len-1 do r2:=r2*list[i];
// resultat zurückgeben
result:=int(r2/r1);
end;
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
|
|
Zitat
|