// 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;


 

Zugriffe seit 6.9.2001 auf Delphi-Ecke