Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Zahlenkombinationen generieren (https://www.delphipraxis.net/160350-zahlenkombinationen-generieren.html)

Georg25 9. Mai 2011 16:06

Zahlenkombinationen generieren
 
Hallo,

ich möchte alle Kombinationen einer Zahl generieren, allerdings ist die Länge der Zahl dynamisch.

Ein kleines Beispiel:

Ich hab die Zahl: 111

jeder Ziffer soll von 1 bis 15 hochgezählt werden,

111
112
...
1115
121
122
...
1215
usw.

nun ist jedoch die Anzahl (111) dynamisch (könnte auch 1111111 sein) und die max. Zahl 15 auch (könnte auch 20 sein).

Ich hab es versucht über Schleifen zu lösen, was bei einer fixen Anzahl auch nicht das Problem ist, da jedoch es dynamisch werden soll
schaffe ich es nicht alleine.

Hat jemand eine Idee dazu?

mfg
Georg

s.h.a.r.k 9. Mai 2011 16:37

AW: Zahlenkombinationen generieren
 
Wenn du eine Schleife hast, dann poste diese doch hier mal. Sollte diese funktionieren, dann dürfte das Erweitern absolut kein Problem sein. Eigentlich musst du nur die oberen Grenzen variabel gestalten.

PS: Herzlich willkommen in der DP :dp:

Georg25 9. Mai 2011 17:02

AW: Zahlenkombinationen generieren
 
Huhu,

Danke für die schnelle Antwort.

Hier ein Beispiel (allerdings STATISCH)

Code:
procedure TForm_Main.Generator;
var g,e,o,r:integer;
begin
  r:=15;

  for g:=1 to r do
    for e:=1 to r do
      for o:=1 to r do Memo_Output.Lines.Add (IntTOStr(g)+IntTOStr(e)+IntTOStr(o));

end;
Das wäre hier halt 111 bis 282828, allerdings wird für die Zahl (111) "3" eingeben und ist somit dynamisch, also die Anzahl der Schleifen (Durchläufe) variert.

himitsu 9. Mai 2011 17:15

AW: Zahlenkombinationen generieren
 
Hier im Forum suchenMrBruteForce ?

CarlAshnikov 9. Mai 2011 17:17

AW: Zahlenkombinationen generieren
 
Hi,ich würde die Sache rekursiv angehen. Mach dir eine Funktion die von 1 bis r zählt und jeweils nen Index der Ziffer bekommt. Jeder Aufruf dekrementiert den Index. Ausgabe nur bei Index = 0 (die letzte Stelle halt).

s.h.a.r.k 9. Mai 2011 17:20

AW: Zahlenkombinationen generieren
 
Delphi-Quellcode:
procedure TForm_Main.Generator(Start, Stop: Integer);
var
  x, y, z : Integer;
begin
  Memo_Output.Lines.BeginUpdate(); // -> wichtig, wenn man viele Werte
                                   // auf einmal einfügen will
  try
    // Beachte die Format-Funktion, damit schaut es etwas übersichtlicher aus
    for x := Start to Stop do
      for y := Start to Stop do
        for z := Start to Stop do Memo_Output.Lines.Add(Format('%d%d%d', [x, y, z]));
  finally
    Memo_Outpu.Lines.EndUpdate();
  end;
end;

Jumpy 9. Mai 2011 17:28

AW: Zahlenkombinationen generieren
 
Vom Ansatz her könnte es wie unten gehen. Da gerade ohne Delphi nur ungetestet.

Delphi-Quellcode:
var
  stellen, max, i, j : Integer;
  pos : Array of Integer;
  s : String;
begin
  stellen := 3;
  max:= 15;
  SetLength(pos, stellen);
 
  for i:= 0 To stellen-1 do
    pos[i]:=1;

  for i:= 1 to max*stellen
    begin
      s:='';
      Inc(pos[0]);

      for j:=0 To stellen -1 do
        if pos[j]=max+1 then
          begin
            pos[j]:=1;
            Inc(pos[j+1]);
          end;


      for j:=0 To stellen -1 do    
        s:=s+IntToStr(pos[j]);
      Memo_Output.Lines.Add(s);
    end;
end;
Edit:
for i:= 1 to max*stellen //Das muss natürlich max hoch stellen sein, wie ich bei BUG gesehen habe

Blup 9. Mai 2011 17:33

AW: Zahlenkombinationen generieren
 
Da die Anzahl der Stellen und die Anzahl der Ziffern variabel sein soll, vieleicht etwas in dieser Richtung:
Delphi-Quellcode:
unit Kombination;

interface

uses
  Classes;

type
  TKombination = record
  private
    FValue: Integer;
    FAnzahlStellen: Integer;
    FKleinsteZiffer: Integer;
    FGroesteZiffer: Integer;
    function MaxValue: Integer;
    function ZiffernAnzahl: Integer;
    function ZiffernWert(AIndex: Integer): Integer;
  public
    constructor Create(AnzahlStellen, KleinsteZiffer, GroesteZiffer: Integer);
    function Inc: Boolean;
    function GetZiffer(AIndex: Integer): Integer;
  end;

procedure Test(AItemList: TStrings);

implementation

uses
  SysUtils, Math;

constructor TKombination.Create(AnzahlStellen, KleinsteZiffer, GroesteZiffer: Integer);
begin
  FValue         := 0;
  FAnzahlStellen := AnzahlStellen;
  FKleinsteZiffer := KleinsteZiffer;
  FGroesteZiffer := GroesteZiffer;
end;

function TKombination.MaxValue: Integer;
begin
  Result := ZiffernWert(FAnzahlStellen) - 1;
end;

function TKombination.ZiffernAnzahl: Integer;
begin
  Result := FGroesteZiffer - FKleinsteZiffer + 1;
end;

function TKombination.ZiffernWert(AIndex: Integer): Integer;
begin
  Result := Trunc(Power(ZiffernAnzahl, AIndex));
end;

function TKombination.Inc: Boolean;
begin
  Result := FValue < MaxValue;
  if Result then
    FValue := FValue + 1;
end;

function TKombination.GetZiffer(AIndex: Integer): Integer;
begin
  if (AIndex < 0) or (AIndex >= FAnzahlStellen) then
    raise Exception.CreateFmt('GetZiffer(%d) Index außerhalb des gültigen Wertebereichs', [AIndex]);

  Result := (FValue div ZiffernWert(AIndex)) mod ZiffernAnzahl;
  Result := Result + FKleinsteZiffer;
end;


procedure Test(AItemList: TStrings);
var
  lKombination: TKombination;
  s: String;
  i, n: Integer;
begin
  AItemList.Clear;

  lKombination := TKombination.Create(3, 1, 15);
  repeat
    s := '';
    for i := 2 downto 0 do
    begin
      n := lKombination.GetZiffer(i);
      if n < 10 then
        s := s + IntToStr(n)
      else
        s := s + Char(Ord('A') + n - 10);
    end;
    AItemList.Add(s);
  until not lKombination.Inc;
end;

end.

BUG 9. Mai 2011 17:38

AW: Zahlenkombinationen generieren
 
Was möchtest du? Zahlen im 15er-System (s=15) mit 3 (z=3) Ziffern anzeigen.
Die Ziffern sind hier die Zeichenketten '1' = 0, '2' = 1, ..., '15' = 14.

Viele solche Zahlen gibt es?
s^z = 15^3
Man kann die von 0 bis (15^3)-1 durchnummerieren.

Wenn du jetzt noch weißt, wie man zwischen Zahlensystemen umrechnet bist du schon am Ziel.

Allerdings kommen damit einige Zahlen doppelt vor, was aber irgendwie deiner Problembeschreibung entspricht.
Code:
1   1   11   10
1   11   1   150
11   1   1   2250


PS: Ja ich habe den roten Kasten gesehen.

Georg25 9. Mai 2011 18:26

AW: Zahlenkombinationen generieren
 
Danke für die vielen Antworten.
Ich habe mal den Code von Jumpy ausprobiert, der funktioniert mit dem Edit so, wie ich mir das vorstelle.
Aber auch allen anderen vielen Dank. Ich habe wieder was dazugelernt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz