![]() |
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. |
AW: Zahlenkombinationen generieren
Code:
Ich hab nun diesen Code benutzt, allerdings spuckt er am Ende immer eine Fehlermeldung aus:
procedure TForm_Main.Generator;
var stellen, max, i, j, k : Integer; pos : Array of Integer; s : String; begin stellen := 3; max:= 15; SetLength(pos, stellen); k := StrToInt(FloatToStr(power(stellen,max))); for i:= 0 To stellen-1 do pos[i]:=1; for i:= 1 to k do 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; Exception der Klasse "EInvalidPointer", "ungültige Zeigeroperation" ![]() Ich hab einiges versucht, aber irgendwie komme ich nicht weiter, hat wer noch eine Idee? mfg |
AW: Zahlenkombinationen generieren
Hast Du einmal die Bereichsprüfung aktiviert? Mir kommt diese Stelle nicht ganz koscher vor:
Zitat:
|
AW: Zahlenkombinationen generieren
Hey,
Ich habe das Programm mal laufen gelassen. Zitat:
Mfg Coffeecoder |
AW: Zahlenkombinationen generieren
Genau das meinte ich, man kann schlecht auf einen Nachfolger zugreifen, der gar nicht existiert. Zumindest eine Abfrage, ob j kleiner als High(Pos) ist gehört da noch vorgeschaltet.
|
AW: Zahlenkombinationen generieren
Man muss nicht unbedingt prüfen, man muss nur Fehlerfrei programmieren:oops:
Da ich das glaub ich ursprünglich verbrochen habe: for j:=0 To stellen -1 do muss einfach nur for j:=0 To stellen -2 do heißen, da pos[stellen-1] natürlich das letzte Element des Array ist und pos[j+1] daher für j=stellen-1 nie funktionieren kann. Das nachher alles bei 151515 endet, muss man über die äußere Schleife steuern, kann also sein das bei k := StrToInt(FloatToStr(power(stellen,max))); nochwas abgezogen werden muss, oder mit max-1 gerechnet werden muss. Hab das damals ja ohne Delphi ins Forum getippt. |
AW: Zahlenkombinationen generieren
Zitat:
|
AW: Zahlenkombinationen generieren
Code:
Ich hab nun eine Abfrage hinzugefügt, allerdings sind nun alle "doppelzahlen" (22,33) immer 11 :/
procedure TForm_Main.Generator;
var stellen, max, i, j, k : Integer; pos : Array of Integer; s : String; begin stellen := 2; max:= 3; SetLength(pos, stellen); k := StrToInt(FloatToStr(power(max, stellen))); for i:= 0 To stellen-1 do pos[i]:=1; for i:= 1 to k do begin s:=''; Inc(pos[0]); for j:=0 To stellen -1 do if pos[j]=max+1 then begin pos[j]:=1; if high(pos) < pos[j+1] then Inc(pos[j+1]); end; for j:=0 To stellen-1 do s:=s+IntToStr(pos[j]); Memo_Output.Lines.Add(s); end; end; |
AW: Zahlenkombinationen generieren
Delphi-Quellcode:
Für das funktionale Problem fehlt mir im Moment die Zeit, den Code logisch nachzuvollziehen.
if j < high(pos) then
Inc(pos[j+1]); |
AW: Zahlenkombinationen generieren
Super, Danke das war schon, nun funktioniert es :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 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-2025 by Thomas Breitkreuz