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....
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
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?
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.
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
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
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
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.