En panne d'algorithme pour trouver une somme dans un tableau

Résolu
persolaser Messages postés 33 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 12 octobre 2014 - 9 avril 2012 à 00:32
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 11 avril 2012 à 23:51
Bonjour à tous.

Je suis en panne de logique et appelle à l'aide vos lumières :
J'ai un tableau de n montants (les factures)
Je reçois un chèque d'un montant inconnu

Comment scanner le tableau de façon intelligente (et pas trop longue) pour repérer les membres dont la somme est égale au montant du chèque ???

ça a l'air tout simple, mais j'y ai déjà laissé deux crocs et une molaire. D'où mon appel à l'aide .

Merci par avance de votre aide.
Roland


Petit proverbe chinois : plus près de la lumière, tu es éclairé!

25 réponses

LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
9 avril 2012 à 19:04
oups !

Si le montant du chèque dépasse la somme des 2 premières et inférieur à celle des 3 premières..

[] Ce qui va sans dire. va mieux en le disant.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
9 avril 2012 à 21:02
Bonjour à tous

peut etre selon l'algo suivant
si j'ai x facture
crée un nombre binaire de x chiffres
avec le chiffre binaire remplacer les 1 par
le montant de la facture correpondant selon
l'ordre établi
en verifiant le nombre de 1 si > 2 on remplace
les 1 et calcule la somme
si la somme convient et la liste de facture convient on arrete
si non on continue à prochain nombre binaire

ex j'ai 4 factures A B C D
le premier nombre binaire qui est la somme de deux factures est 3
donc j'ai 0011
je remplace 1 par C et 1 par D
la somme est c+D
correspond ?
non
on continue avec le prochain nombre
en verifiant le nombre de 1 si > 2 on remplace
les 1 et calcule la somme
jusqu'à 2^(nombres de facture) -1
0
persolaser Messages postés 33 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 12 octobre 2014
9 avril 2012 à 22:55
Je suis ravi d'avoir généré autant d'intérêt.

Je m'oriente effectivement vers une solution en base binaire comme évoqué dans mon calcul du nombre des possibilités, développé par Shayw, sans récursivité.

Merci à tous
Merci de vos éclairages et lumières
0
persolaser Messages postés 33 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 12 octobre 2014
9 avril 2012 à 22:58
Au fait, et pour satisfaire simultanément CFoutu et LiiiiiiiiiibreMax, la règle d'antériorité s'applique effectivement à l'exception des pièces frappées de litiges. Il est néanmoins plus pratique, dans des relations normales et sauf excès, d'appliquer les choix du Client qd aux factures réglées. D'où ce petit bout de logique.

Roland
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
11 avril 2012 à 23:51
Salut
teste 20 factures
sur la form placer un bouton et un listbox

Private listfacture() As Integer
Private listdessommes() As String
Private counter As Integer
Private sumcheques As Integer
Private nfacture As Integer
Private Function ConvertToBinary(ByVal number As Long) As String
  Dim acc As String
  acc = ""
  While number > 0
    acc = acc & number Mod 2
    number = number \ 2
    Wend
  ConvertToBinary = Format(StrReverse(acc), String(nfacture, "0"))
End Function

Private Function ComputeSumfacture(binarynum As String, ByRef sumfacture As Integer) As String
  Dim digit As String
  Dim facturename As String
  sumfacture = 0
  facturename = ""
  For pos = 1 To Len(binarynum)
     digit = Mid(binarynum, pos, 1)
     If digit = 1 Then
       sumfacture = sumfacture + listfacture(pos - 1)
      facturename = facturename & " facture n: " & pos
     End If
  Next pos
     facturename = facturename & " total : " & sumfacture
     ComputeSumfacture = facturename
End Function
Private Sub Form_Load()
  Dim r As Integer
  nfacture = 20
  Me.Command1.Caption = "Proceder"
  List1.Width = Me.Width - 5
  List1.Height = Me.Height - Me.Command1.Height * 4
  List1.Left = 0
  List1.Top = Me.Command1.Top + Me.Command1.Height
  ReDim listfacture(nfacture - 1)
  Randomize
  For iter = 0 To nfacture - 1
    listfacture(iter) = Int(Rnd * 1200) + 10
    List1.AddItem ("facture n : " & iter + 1 & " = " & listfacture(iter))
  Next iter
  sumcheques = 0
  r = Int(Rnd * nfacture)
  If r = 0 Then
    r = 1
  End If
  For iter = 0 To r
    sumcheques = sumcheques + listfacture(iter)
  Next iter
   
   List1.AddItem ("le montant du cheque = " & sumcheques)
  List1.AddItem (vbCrLf)
End Sub



Private Sub Command1_Click()
 Me.Command1.Enabled = False
 Dim binary As String
 Dim lessommes As String
 Dim iter As Long
 Dim sumfacture As Integer
 iter = 3
 While iter <= 2 ^ nfacture - 1
   If (Log(iter) / Log(2)) - Round((Log(iter) / Log(2)), 2) <> 0 Then
      binary = ConvertToBinary(iter)
      lessommes = ComputeSumfacture(binary, sumfacture)
      If sumfacture = sumcheques Then
        ReDim Preserve listdessommes(counter)
        listdessommes(counter) = lessommes
        List1.AddItem (lessommes)
        counter = counter + 1
      End If
   End If
   iter = iter + 1
 Wend
 Me.Command1.Enabled = True
End Sub
0
Rejoignez-nous