Calcul de combinaisons de nombres

Menfis

XLDnaute Nouveau
Bonjour,

j'aimerais calculer et afficher toutes les combinaisons possibles d'une suite de nombres : 33 66 55 23

Je sais qu'il y a 24 possibilités (le résultat de la factorielle 4), mais j'aimerais pouvoir visualiser l'ensemble de ces possibilités.

Merci à vous pour l'aide que vous pourriez m'apporter.
 

hoerwind

XLDnaute Barbatruc
Re : Calcul de combinaisons de nombres

Bonjour et bienvenu sur le forum,

Question souvent posée.
Consulte les messages au bas de cette page sous "Discussions similaires".
Si tu ne trouve pas ton bonheur, fais une recherche sous ls anciens messages avec "combinaison" comme mot clef, tu trouveras certainement.
 

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Calcul de combinaisons de nombres

Bonjour à tous,

voir fichier joint
changer les données dans les cellules jaunes

à+
Philippe
 

Pièces jointes

  • 111.xls
    32.5 KB · Affichages: 350
  • 111.xls
    32.5 KB · Affichages: 303
  • 111.xls
    32.5 KB · Affichages: 315

JNP

XLDnaute Barbatruc
Re : Calcul de combinaisons de nombres

Bonjour le fil :),
Philippe, j'aurais bien vu en B6
Code:
=INDEX($B$3:$E$3;ENT((LIGNES($1:1)-1)/6+1))
à glisser vers le bas, mais après, j'avoue que je coince un peu :eek:...
Bonne journée :cool:
 

klin89

XLDnaute Accro
Re : Calcul de combinaisons de nombres

Bonsoir JNP, phlaurent55, hoerwind, Menfis
Bonsoir à tous,

Tu parles de permutations :
Trouvé sur le net, l'Algorithme de Johnson Trotter en VBA

A placer dans un module standard
VB:
Public Tablo As Variant
Option Base 1
 
Sub Lister_Les_Permutations()
'Tablo = Array("", "33", "66", "55", "23")
'Si Option Base 1
Tablo = Array("33", "66", "55", "23")
GenPermutations UBound(Tablo)
End Sub
 
Sub GenPermutations(ByVal N As Long)
   ' [url=http://www.xtremevbtalk.com/showthread.php?t=168296]Lotto Algorithms - Permutations, Combinations - Xtreme Visual Basic Talk[/url]
   ' "Johnson-Trotter" VB6 implementation by MathImagics (Dec 2004)
   '   Each permutation is obtained from the previous by
   '   swapping just ONE pair of adjacent items.
   '
 
   Dim Item()   As Long   ' items to permute
   Dim Link()   As Long   ' 0 = link left, 1 = right
   Dim j        As Long
   Dim K As Long, kSpot As Long  ' largest mobile K and its position
   Dim P As Long, pSpot As Long  ' iterator value P, its position
   Dim mobile   As Boolean         ' "mobility" test flag
   Dim kLink    As Long
   '
   ' 0. Setup initial state
   '
   ReDim Item(N), Link(N)
   For j = 1 To N
      Item(j) = j
      Next
    i = 0 'adaptation
   Do
      '
      ' 1. report current permutation
      '
'      Debug.Print Item(1);
'      For j = 2 To N: Debug.Print ","; Item(j);: Next
'      Debug.Print
 
'-----début adaptation
      i = i + 1
      For j = 1 To N
        Cells(i, j) = Tablo(Item(j)) ': i = i + 1
      Next j
'-----fin adaptation
'
      ' 2. select "mobile" position with highest value
      '
      K = 0
      pSpot = 0
 
      Do While pSpot < N
         pSpot = pSpot + 1
         P = Item(pSpot)
 
         mobile = False
 
         If Link(pSpot) = 0 Then
            If pSpot > 1 Then
               If Item(pSpot - 1) < P Then mobile = True
               End If
         ElseIf pSpot < N Then
            If Item(pSpot + 1) < P Then mobile = True
            End If
         
         If mobile Then
            If P > K Then
               K = P
               kSpot = pSpot
               If K = N Then Exit Do ' look no further
               End If
            End If
         Loop
 
       If K = 0 Then Exit Do  ' all done!
 
       '
       ' 3.  Swap item kSpot with "neighbour"
       '
       kLink = Link(kSpot)
       If kLink Then
          Item(kSpot) = Item(kSpot + 1): Link(kSpot) = Link(kSpot + 1)
          Item(kSpot + 1) = K:           Link(kSpot + 1) = 1
       Else
          Item(kSpot) = Item(kSpot - 1): Link(kSpot) = Link(kSpot - 1)
          Item(kSpot - 1) = K:           Link(kSpot - 1) = 0
          End If
       '
       ' 4. Toggle Links for any items > K
       '
       For pSpot = 1 To N
          If Item(pSpot) > K Then Link(pSpot) = 1 - Link(pSpot)
          Next
       Loop
   End Sub

Klin89
 

Victor21

XLDnaute Barbatruc
Re : Calcul de combinaisons de nombres

Bonsoir à tous.

Merci, klin de nous avoir communiqué cet algorithme très intéressant.
On doit pouvoir généraliser (valeurs de A1 à D1) :
Tablo = Array(Range("a1").Value, Range("b1").Value, Range("c1").Value, Range("d1").Value)
en initialisant i à 1
Fonctionne aussi avec une 5° valeur, mais le classement s'en retrouve tout chamboulé.
Un tri sur les colonnes DEF, puis ABC remet tout en ordre.
 

Staple1600

XLDnaute Barbatruc
Re : Calcul de combinaisons de nombres

Re


Une question pour Victor21 ;)
Pourquoi plutot
Code:
Tablo = Array(Range("a1").Value, Range("b1").Value, Range("c1").Value, Range("d1").Value)
que
Code:
Tablo=[A1].Resize(,4).Value

PS: ou même
Code:
Tablo=[A1:D1]
 

Discussions similaires

Statistiques des forums

Discussions
312 298
Messages
2 086 977
Membres
103 416
dernier inscrit
SEB28110