Autor Beitrag
downdapp
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 18.10.02 18:07 
Habe 16Variablen a1..a16.

für jede Variable ist 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 als zahl möglich.

Wie kann ich alle Möglichen Verteilung rauskriegen ohne das eine Zahl 2 mal

vorkommt?


Ich meine

die erste Möglickeit wäre:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

die zweite

1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 15

die dritte

1 2 3 4 5 6 7 8 9 10 11 12 13 15 16 14 oder ähnlich

__________________________________

so was wie hier will ich aber nicht

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3
usw.

es sind 2.09*10^13 Möglichkeit

ps. ich suche nicht die Anzahl, sondern jede einzelne KOmbination :shock:
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 18.10.02 19:00 
Hi!

Mit folgendem Code sollte es gehen. Funktioniert per Rekursion. Es werden zwei Arrays verwendet. In "fest" wird die Zahlenfolge gespeichert, die schon fest ist und in "vorrat" alle die Zahlen, die noch permutiert werden müssen. Ist in "vorrat" nur noch eine Zahl, kann "fest" + "vorrat" geschrieben werden.

Er gibt es noch in Datei aus, aber das kannst Du ja abwandeln, wie Du willst!


ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
var
  Form1: TForm1;
  ergebnis : Textfile;

implementation

{$R *.dfm}

procedure perm (fest, vorrat : ARRAY OF Integer);
VAR i,k : INTEGER;
    temp : STRING;
    neu_fest : ARRAY OF Integer;
    neu_vorrat : ARRAY OF Integer;
begin
  if Length(vorrat)=1 THEN
  begin
    temp:='';
    for i:=0 TO High(fest) DO temp:=temp+IntToStr(fest[i])+' ';
    temp:=temp+IntToStr(vorrat[0]);
    Writeln(ergebnis,temp);
  end else
  begin

    SetLength(neu_fest,Length(fest));
    for i:=0 TO High(fest) DO neu_fest[i]:=fest[i];

    SetLength(neu_fest,Length(neu_fest)+1);

    for i:=0 TO High(vorrat) DO
    begin
      neu_fest[High(neu_fest)]:=vorrat[i];

      SetLength(neu_vorrat,Length(vorrat)-1);
      FOR k:=0 TO i-1 DO neu_vorrat[k]:=vorrat[k];
      FOR k:=i+1 TO High(vorrat) DO neu_vorrat[k-1]:=vorrat[k];

      perm(neu_fest,neu_vorrat);
    end;
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
const anzahl = 4;
VAR i : INTEGER;
    leer : ARRAY OF Integer;
    zahlen : ARRAY OF Integer;
begin
  AssignFile(ergebnis,'c:\ausgabe.txt');
  ReWrite(ergebnis);
  SetLength(zahlen,anzahl);
  SetLength(leer,0);
  for i:=0 TO anzahl-1 DO zahlen[i]:=i+1;
  perm(leer,zahlen);
  ShowMessage('Fertig!');
  CloseFile(ergebnis);
end;


MfG,
Peter

P.S: Anzahl muss bei Dir dann 16 sein.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".