Behöver hjälp med en programmeringsbit.. Så himla klurig är den väl inte, om man inte försöker vara smart och göra vissa optimeringar. En (mycket naiv) variant, ändrar ordning och använder parenteserKlurig mattefunktion
5st tal från 1 t.om 9 ska slumpas fram samt ett tal mellan 10 och 100 (1-9 samt 11-99 alltså)
Jag skulle vilja ha en funktion som räknar ut vilken kombination av de 5 talen tillsammans med de 4 räknesätten som kommer närmast det 2siffriga talet..
exempel med 3 tal: 8, 3 och 5 och sen 22.. 3 * 5 + 8 ger 23, vilket borde vara så nära 22 vi kan kommaSv: Klurig mattefunktion
Hur är det med att byta ordning på talen, att använda parenteser, osv.?
Om vi säger att vi kör med en fix ordning, och skippar korrekt operatorordning så får vi
Typ (i något pseudospråk):
CalcNext(Number SoFar, Numbers Left)
If no numbers left
return SoFar
else
For Each Operator In [+, -, *, /]
ThisTry = CalcNext(SoFar [operator] Left.First, Left.Rest)
if ThisTry is better than BestTry: BestTry = ThisTry
Next
return BestTry
end if
Precedensregler bör man kunna ordna genom att antingen införa parenteser eller möjlighet att ändra ordning.Sv: Klurig mattefunktion
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim slumpadeTal As New System.Collections.Generic.List(Of faktor)
Dim målet As Double = CInt(Rnd() * 88) + 11
For i As Integer = 1 To 5
slumpadeTal.Add(New faktor(CInt(Rnd() * 8) + 1))
Next
Dim detbästa As faktor = New faktor(0)
Dim resarr As System.Collections.Generic.List(Of faktor) = HittaAllaMöjligaVärden(slumpadeTal)
For Each res As faktor In resarr
If Math.Abs(res.värde - målet) < Math.Abs(detbästa.värde - målet) Then detbästa = res
Next
Console.WriteLine(detbästa.namn & "=" & detbästa.värde & " (målet är " & målet & ")")
End Sub
Private Function HittaAllaMöjligaVärden(ByVal enLista As System.Collections.Generic.List(Of faktor)) As System.Collections.Generic.List(Of faktor)
Dim resultat As New System.Collections.Generic.List(Of faktor)
If enLista.Count = 1 Then
' har listan bara ett värde så kan vi inte gärna göra mycket mer än returnera det
resultat.Add(enLista(0))
Else
For Each enFaktor As faktor In enLista
Dim temp As New System.Collections.Generic.List(Of faktor)
' kopiera listan eftersom vi destruerar den (lol)
For Each enAnnanFaktor As faktor In enLista
temp.Add(enAnnanFaktor)
Next
' plocka bort det värde vi är på
temp.Remove(enFaktor)
' pröva alla möjliga operationer på resten av listan och värdet vi är på
For Each res As faktor In HittaAllaMöjligaVärden(temp)
resultat.Add(New faktor(res.värde + enFaktor.värde, res.namn & "+" & enFaktor.värde))
resultat.Add(New faktor(res.värde - enFaktor.värde, res.namn & "-" & enFaktor.värde))
resultat.Add(New faktor(res.värde * enFaktor.värde, "(" & res.namn & ")*" & enFaktor.värde))
If enFaktor.värde <> 0 Then
resultat.Add(New faktor(res.värde / enFaktor.värde, "(" & res.namn & ")/" & enFaktor.värde))
End If
If res.värde <> 0 Then
resultat.Add(New faktor(enFaktor.värde / res.värde, enFaktor.värde & "/(" & res.namn & ")"))
End If
resultat.Add(New faktor(enFaktor.värde - res.värde, enFaktor.värde & "-(" & res.namn & ")"))
Next
Next
End If
Return resultat
End Function
Private Class faktor
Public namn As String
Public värde As Double
Public Sub New(ByVal värde As Double)
Me.namn = CStr(värde)
Me.värde = värde
End Sub
Public Sub New(ByVal värde As Double, ByVal namn As String)
Me.namn = namn
Me.värde = värde
End Sub
End Class