// Es werden Zahlen
mit Null und anderen vorgegebenen Zahlen
// addiert. Damit werden alle Möglichkeiten errechnet, die sich
// durch Addition
einer vorgegeben Zahlenreihe ergeben können. Wenn
// man also die Zahlen 1, 2
und 3 hat, so werden die Zahlen erst
// einmal selbst genommen
(Addition mit
0), und dann alle
// Additionsergebnisse. Doppelte Ergebnisse werden
ignoriert:
//
1 (0 + 1)
//
2 (0 + 2)
//
3 (0 + 3)
// 3 (1
+ 2) <----- wird ignoriert
//
4 (1 + 3)
// 5 (2 + 3)
// 6 (1 + 2 + 3)
// Getestet mit D4 unter XP
uses math;
procedure addi(arr: array of Cardinal; ts: TStrings);
var
lg, x: integer;
hlp, prf, sm: Cardinal;
sl: TStringlist;
begin
lg := length(arr);
sl := TStringlist.create;
sl.sorted := true;
sl.duplicates := dupignore;
ts.clear;
hlp := pred(trunc(intpower(2, lg)));
dec(lg);
repeat
sm := 0;
prf := 1;
for x := 0 to lg do begin
if hlp and prf > 0 then inc(sm, arr[x]);
inc(prf, prf);
end;
sl.add(format('%:10d', [sm])); // Sortierung sicherstellen
dec(hlp);
until hlp = 0;
// -------- bei Bedarf --------
sl.sorted := false;
for x := 0 to pred(sl.count) do
sl[x] := trim(sl[x]);
// ----------------------------
ts.assign(sl);
sl.free;
end;
// Beispielaufruf 1
procedure TForm1.Button11Click(Sender: TObject);
begin
Memo1.Alignment := taRightJustify;
addi([5, 3, 7, 20], Memo1.Lines);
end;
// Ergebnis:
3
5
7
8
10
12
15
20
23
25
27
28
30
32
35
|
// Beispielaufruf 2
// Es können alle Zahlen von 0 bis 255 gebildet werden
procedure TForm1.Button11Click(Sender: TObject);
begin
Memo1.clear;
addi([0, 1, 2, 4, 8, 16, 32, 64, 128], Memo1.Lines);
end;
|