Avatar billede fico Nybegynder
01. februar 2002 - 16:18 Der er 14 kommentarer og
1 løsning

x antal kombinationer

Hej

Jeg hvordan laver man et program for man gi'r den fx 15 tal også skal den finde ud af hvor hvilke kompinationer der gir fx 50.

Peter
Avatar billede cool_casper Nybegynder
01. februar 2002 - 16:20 #1
Hvad mener du?? Med gange, plus, minus eller hvad??
Avatar billede fico Nybegynder
01. februar 2002 - 16:21 #2
Sorry  plus
Avatar billede cool_casper Nybegynder
01. februar 2002 - 16:31 #3
Det er vel bare at lave et loop...!

Men jeg tror det lidt svært hvis man skal finde to tilfældige tal der giver 50 f.eks! Men det må være noget med at lave en Function der finder et to tælfældige tal og så ser om der plusset giver 50. Hvis det ikke gør tilføje kompinatioen til et Array... Så finder man to nye... Frasorterer med de kompinationer der ikke passede og ser om de virker....

Men jeg ved det ikke...!
Avatar billede fico Nybegynder
01. februar 2002 - 16:33 #4
Jeg ville gerne have lidt kode
Avatar billede cool_casper Nybegynder
01. februar 2002 - 16:33 #5
HOV mener du hvis det ene tal er femten og det skal give 50 ??!?
Avatar billede fico Nybegynder
01. februar 2002 - 16:38 #6
Nej nej, hvis du har 15 tal. 1 2 3 4 5 6 7 8 9 0 11 12 12 98 1 så skal den finde alle de kompination der kan give 50, og skrive dem.
Avatar billede cool_casper Nybegynder
01. februar 2002 - 16:40 #7
Somsagt, det er ikke nemt, og jeg kan ikke finde ud af hvordan du skal lave det....!
Avatar billede martin_moth Mester
02. februar 2002 - 08:35 #8
Følgende procedure gør vist det du eftersøger (med mindre jeg har misforstået spørgsmålet). Jeg anvender et array Tal() der er fyldt med tilfældige tal mellem 1 og 49 - de grænser kan du jo bare ændre, ligesom du kan ændre antallet af tal i arrayet og den eftersøgte Sum. Jeg regner med at koden er "selvforklarende", ellers spørg...

Private Sub Sum()
  Dim Tal() As Integer
  Dim i As Integer, j As Integer
  Const Sum = 50
  Const AntalTal = 15
  ReDim Tal(1 To AntalTal)
 
  'Fylder Tal() med tilfældige tal mellem 1 og 49
  For i = 1 To AntalTal
    Randomize
    Tal(i) = Int((49 * Rnd) + 1)
  Next i
 
  'Kører gennem samtlige kombinationer
  For i = 1 To AntalTal
    For j = i To AntalTal
      If Tal(i) + Tal(j) = Sum Then
        'bla bla Hvad der nu skal ske når summen er 50
        MsgBox Tal(i) & " + " & Tal(j) & " = " & Sum
      End If
    Next j
  Next i
End Sub

Bemærk, at løkken med j ikke starter med 1 men med i. Således slipper du for at plusse de samme tal mere end en gang... /Martin
Avatar billede mbulow Nybegynder
02. februar 2002 - 15:23 #9
Nu er jeg ikke sikker, men jeg tror nu ikke det er meningen at der kun skal findes løsninger hvor 2 tal lægges sammen... Mon ikke det er alle tænkelige kombinationer, fra kun ét tal, til en kombination af dem alle?
Avatar billede fico Nybegynder
02. februar 2002 - 16:05 #10
(Nu har jeg ikke testet koden)

Det skal være sådan at du giver koden 15 (måske flere, måske mindre) forskællige tal værdier. Så skal den finde ud af, ved hjælp af plusning, finde alle de muligheder der er og skrive dem ned.
Avatar billede mbulow Nybegynder
02. februar 2002 - 20:31 #11
Hejsa :)

Jeg har siddet og hygget mig lidt med din problemstilling, og er kommet frem til følgende kode (Se efterfølgende kommentar for koden)

Jeg har i en dialog lavet fire textfelter:
MyCount - Hvor mange tal der skal arbejdes med
MyNumbers - Tallene separeret med mellemrum
MyGoal - Den sum som kombinationen skal give
MyOutput - Et outputvindue hvor resultaterne vises

Og så selvfølgelige lige en knap: Command1 for at sætte det hele igang

Så ved du ihvertfald hvad mine forskellige variable er, når nu du ikke har formen... Men husk nu at sætte scrollbars og multiline på MyOutput

Jeg har følgende funktioner:
ShowResult : Vis en mulig løsning i MyOutput
QuickSort : Tja... Sorter numrene så det giver mere overskueligt output, behøves egentlig ikke
FindSolutions : Det er den her rekursive funktion der laver det hele
Command1_Click : Aflæs de forskellige værdier og sæt maskineriet igang

Hvis du ikke bruger ShowResult, kan du også lige så godt fjerne alt hvad der handler om blnNumbers, det er bare for at olde styr på hvilke variable der skal udskrives.



PS!!! Du må meget undskylde hvis det er uove3rskuelig eller roden, men det er altså første gang jeg laver noget i VB, så jeg håber det går.
Du havde en sjov problemstilling, så jeg implementerede den i C, og portede til VB bagefter :) LOL
Avatar billede mbulow Nybegynder
02. februar 2002 - 20:32 #12
Private Sub ShowResult(intNumbers() As Integer, intLast As Integer, blnNumbers() As Boolean)
    For i = 0 To intLast
        If blnNumbers(i) = True Then
            MyOutput.Text = MyOutput.Text + Str(intNumbers(i))
        End If
    Next
    MyOutput.Text = MyOutput.Text + vbCrLf
End Sub

Private Sub QuickSort(intNumbers() As Integer, l As Integer, r As Integer)
    Dim i As Integer
    Dim j As Integer
    Dim x As Integer
    Dim y As Integer
 
    i = l
    j = r
    x = intNumbers((l + r) / 2)
 
    While i <= j
 
        While intNumbers(i) < x And i < r
            i = i + 1
        Wend
   
        While x < intNumbers(j) And j > l
            j = j - 1
        Wend

        If i <= j Then
            y = intNumbers(i)
            intNumbers(i) = intNumbers(j)
            intNumbers(j) = y
            i = i + 1
            j = j - 1
        End If
 
    Wend
 
    If l < j Then
        Call QuickSort(intNumbers, l, j)
    End If
    If i < r Then
        Call QuickSort(intNumbers, i, r)
    End If
End Sub

Private Sub FindSolutions(intNumbers() As Integer, intCount As Integer, intFirst As Integer, intSum As Integer, intGoal As Integer, blnNumbers() As Boolean)
    Dim i As Integer
   
    For i = intFirst To intCount - 1
        If intSum + intNumbers(i) <= intGoal Then
            blnNumbers(i) = True
            If intSum + intNumbers(i) = intGoal Then
                Call ShowResult(intNumbers, i, blnNumbers)
            Else
                Call FindSolutions(intNumbers, intCount, i + 1, intSum + intNumbers(i), intGoal, blnNumbers)
            End If
            blnNumbers(i) = False
        Else
            Exit For
        End If
    Next
End Sub

Private Sub Command1_Click()
    Dim blnNumbers() As Boolean
    Dim i As Integer
    Dim intCount As Integer
    Dim intNumbers() As Integer
    Dim strNumbers() As String
   
    intCount = MyCount.Text
    ReDim blnNumbers(intCount)
    ReDim intNumbers(intCount)
   
    strNumbers = Split(MyNumbers.Text, " ")
    For i = 0 To intCount - 1
        blnNumbers(i) = False
        intNumbers(i) = strNumbers(i)
    Next
   
    Call QuickSort(intNumbers, 0, intCount - 1)
   
    Call FindSolutions(intNumbers, intCount, 0, 0, MyGoal.Text, blnNumbers)
End Sub
Avatar billede mbulow Nybegynder
02. februar 2002 - 20:36 #13
Det jeg gør i FindSolutions, er ganske simpelt at løbe samtlige kombinationer af tallene igennem, men samtidig holder jeg øje med om tallet når værdien intGoal.

Hvis den bliver intGoal, viser jeg den i MyOutput.
Bliver den større end intGoal, går jeg igang med den næste kombinationsmulighed.

PS!!! Den virker faktisk kun rigtigt hvis du beholder QuickSort, ellers vil den ikke nødvendigvis fange de kombinationer der indeholder
tallet nul. Hvis den alligevel ikke vil, hvis du indtaster negative tal, og et negativt intGoal
Avatar billede mbulow Nybegynder
02. februar 2002 - 20:38 #14
UPS!!! Hvis den alligevel ikke vil => Hvilket den alligevel ikke vil
Avatar billede fico Nybegynder
02. februar 2002 - 22:30 #15
Takker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester