18. januar 2005 - 23:52Der er
19 kommentarer og 1 løsning
Talkombinationer i tabel uden gengangere.
Jeg har en tabel med en talrække [1;20], hvoraf nogle tal kan være "spærret" i forvejen (T[x] := 0), ellers T[x] := 1; Årsagen til de "spærrede" tal kan være underordnet.
I tabellen vil jeg checke et simuleret tal, fx. 26 op imod tabellens "frie" tal og få samtlige talkombinationer, som giver summen 26, vel at mærke UDEN gengangere, fx.: (15 + 11) og (11 + 15), hvilket for mig er ens i denne sammenhæng.
Hvem har en smart løsning? Jeg venter med spænding!!
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
begin maxi := x div 2; for i := 1 to maxi do begin other := x - i; if other <= maxvalid then begin if (valid[i] = 1) and (valid[other] = 1) then begin cb(i, other); end; end; end; end;
var i : integer; T : validlist;
begin for i := 1 to 20 do T[i] := 1; T[9] := 0; T[10] := 0; find(26, T, show); end.
begin sum := 0; for i := 0 to high(res) do begin if res[i] then begin sum := sum + (i+1); end; end; if sum = x then begin cb(res); end else if sum < x then begin for i := startix to high(res) do begin if valid[i] then begin res[i] := true; find2(x, valid, cb, res, i+1); res[i] := false; end; end; end; end;
begin setlength(res, high(valid) + 1); for i := 0 to high(res) do res[i] := false; find2(x, valid, cb, res, 0); end;
var i : integer; t : numlist;
begin setlength(t, 9); for i := 0 to high(t) do t[i] := true; (* VIGTIGT : hvis 8 ikke må bruges er det t[7] som skal sættes til false *) find(12, t, show); end.
Jeg forstår ikke typedeklarationerne, setlength og high(x). Det virker ikke i Delphi 2, hvor jeg vil lave et Windows-program med boxe, knapper osv.
Kan du lave din kode om til fx. Borland Pascal 7.0, som jeg kender bedst, for jeg er en gammel DOSmer! Så får jeg det nok tilpasset Delphi2.
Ellers kunne jeg sende min aktuelle kode, hvor jeg ikke får kombinationer med mere end 2 tal. Jeg mangler det rekursive kald, som jeg ikke kan få programmeret.
Hej igen, hvis det er dig lige meget, så vil jeg hellere, at du kigger på min kode. Dels har jeg nu arbejdet så meget med den, at det svært at sætte mig ind i en anden algoritme. Dels kan jeg bedre overse den række- følge kombinationerne vises i.
Hvis OK, så sender jeg den senere.
PS: Er selve koden nok, eller skal du bruge alle filer i projektet?
PROCEDURE TForm1._optionsClick(Sender: TObject); VAR T : Tabel; Txt, Txt2 : String; I, First, J, Max, X : Byte;
BEGIN FOR I := 1 TO 9 DO T[I] := 1;
FOR I := 9 DOWNTO 1 DO BEGIN IF T[I] = 1 THEN BEGIN First := I; J := First; Max := 12; Txt := ''; WHILE (J <= Max) AND (T[J] = 1) DO BEGIN Txt := Txt + IntToStr(J) + ' - '; T[J] := 0; Dec(Max,J); J := Max; Txt2 := ''; IF Max = 0 THEN BEGIN Delete(Txt,Length(Txt)-2,3); { Txt trimmes } LB2.Items.Add(Txt);
FOR X := 1 TO 9 DO Txt2 := Txt2 + IntToStr(T[X]);
LB1.Items.Add(Txt2); END;
{ IF ((Length(Txt) > 1) AND (T[First] = 0)) THEN BEGIN Max := 12; Text := ''; T[First] := 1; J := First; }
{ Er længden af [Txt] større end 1, så undersøges der for flere lavere talværdier med samme starttal, fx. 9,8 osv. Det er i hvert fald ideen; men programmet loop'er, så en rekursiv procedure a lá Find2 må være løsningen. }
{ END; } END; { WHILE .. } END; { IF .. } END; { FOR I .. } END;
PROCEDURE TForm1._slutClick(Sender: TObject); BEGIN Application.Terminate; END; END.
OK, så må din kode laves til TP7 / Delphi2, hvis du har tid!
Har ikke forstået meningen med, at numlist først sættes til TRUE alle 9 elementer, og i proceduren find, sættes 9 + 1 elementer til FALSE. Er det legalt i Delphi2?
begin sum := 0; for i := 0 to 8 do begin if res[i] then begin sum := sum + (i+1); end; end; if sum = x then begin show(res); end else if sum < x then begin for i := startix to 8 do begin if valid[i] then begin res[i] := true; find2(x, valid, res, i+1); res[i] := false; end; end; end; end;
procedure find(x : integer; valid : numlist);
var i : integer; res : numlist;
begin for i := 0 to 8 do res[i] := false; find2(x, valid, res, 0); end;
var i : integer; t : numlist;
begin for i := 0 to 8 do t[i] := true; find(12, t); end.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.