Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#8

AW: Zahlenkombinationen generieren

  Alt 9. Mai 2011, 17:33
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.
  Mit Zitat antworten Zitat