![]() |
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 |
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: |
AW: Zahlenkombinationen generieren
Huhu,
Danke für die schnelle Antwort. Hier ein Beispiel (allerdings STATISCH)
Code:
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.
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; |
AW: Zahlenkombinationen generieren
|
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).
|
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; |
AW: Zahlenkombinationen generieren
Vom Ansatz her könnte es wie unten gehen. Da gerade ohne Delphi nur ungetestet.
Delphi-Quellcode:
Edit:
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; for i:= 1 to max*stellen //Das muss natürlich max hoch stellen sein, wie ich bei BUG gesehen habe |
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. |
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. |
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. |
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