Det känns som allting går för långsamt kanske det beror på min kassa dator men över till frågan. Jag är inte mycket för att sitta och jaga millisekunder av exekveringstid i mina program om det inte behövs. Hellre jagar jag minuter och timmar sparad programmeringstid :-) Skulle tänka mig: Hej Sven jag upptäckte det också nyss men tänkte ta double. Visste knappt att currency fanns men funkar det att använda båda? Ta ut antal nollor i ett tal
Jag håller på att testa olika lösningar och försöker få fram den snabbaste lösningen.
Av dom tre olika lösningarna nedan är nummer 1 snabbast men den tar ganska mycket minne när man gör den större. Men jag tror lösning 3 är bäst både minnes och (om jag får till det) snabbhets mässigt. Så jag undrar om någon kan hitta en bra lösning.
Problemet är att få ut hur många nollor (kan vara ettor och tvåor också) det finns i ett 13 siffror långt tal så snabbt som möjligt.
lösning3 har just nu en mid lösning som jag verkligen inte vill ha. Ska väl inte behöva göra om den till string?. Jag hoppas att det ska gå att skippa den innersta loopen också.
Jag löste något liknande för ett tag sen men då handlade det om ett binärt tal och räkna hur många ettor det innehöll och det var mycket enklare att fixa?
Det kanske går att spara 13 siffor (siffror ska vara mellan 1 och 3) på något annat och smartare sätt som jag missat får ni gärna hojta till?
ps visst är singel snabbaste datatypen om man måste använda 13 siffror??
<code>
Option Explicit
Dim nollor(13) As Single
Private Sub Command1_Click()
Dim x&, y&, z&, lngAntal&, lngAntalRattTecken&, sngTemp As Single, strTemp$
Dim TestArray1() As Long, TestArray2() As String, TestArray3() As Single
Dim oTmr As CStopWatch, start, fin
'Vilket antal beror på hur snabb dator och hur länge du vill vänta
lngAntal = 600
Set oTmr = New CStopWatch
TestArray1 = laddaArray1(lngAntal)
TestArray2 = laddaArray2(lngAntal)
TestArray3 = laddaArray3(lngAntal)
Text4.Text = "LaddaArrayer " & "Tid: " & Round(oTmr.Elapsed / 1000, 4) & " sek"
'Första varianten
Set oTmr = New CStopWatch
For x = 0 To lngAntal
For y = 0 To lngAntal
lngAntalRattTecken = 0
For z = 0 To 12
If TestArray1(x, z) = TestArray1(y, z) Then lngAntalRattTecken = lngAntalRattTecken + 1
Next z
Next y
Next x
Text1.Text = "Loop1 " & "Tid: " & Round(oTmr.Elapsed / 1000, 4) & " sek"
'Andra varianten
Set oTmr = New CStopWatch
For x = 0 To lngAntal
For y = 0 To lngAntal
lngAntalRattTecken = 0
For z = 1 To 13
If Mid(TestArray2(x), z, 1) = Mid(TestArray2(y), z, 1) Then lngAntalRattTecken = lngAntalRattTecken + 1
Next z
Next y
Next x
Text2.Text = "Loop2 " & "Tid: " & Round(oTmr.Elapsed / 1000, 4) & " sek"
'Tredje varianten
Set oTmr = New CStopWatch
For x = 0 To lngAntal
For y = 0 To lngAntal
lngAntalRattTecken = 0
strTemp = CStr(Abs(TestArray3(x) - TestArray3(y)))
'sngTemp = Abs(TestArray3(x) - TestArray3(y))
For z = 1 To 13
'If ?????????? Then lngAntalRattTecken = lngAntalRattTecken + 1
If Mid(strTemp, z, 1) = "0" Then lngAntalRattTecken = lngAntalRattTecken + 1
Next z
Next y
Next x
Text3.Text = "Loop3 " & "Tid: " & Round(oTmr.Elapsed / 1000, 4) & " sek"
End Sub
Private Function laddaArray1(ByVal Antal As Long) As Long()
ReDim lngArr(Antal, 12) As Long
Dim x&, y&
For x = 0 To Antal
For y = 0 To 12
lngArr(x, y) = CLng(Int((3 * Rnd) + 1))
Next y
Next x
laddaArray1 = lngArr
End Function
Private Function laddaArray2(ByVal Antal As Long) As String()
ReDim strArr(Antal) As String
Dim x&, y&
For x = 0 To Antal
For y = 0 To 12
strArr(x) = strArr(x) & (Int((3 * Rnd) + 1))
Next y
Next x
laddaArray2 = strArr
End Function
Private Function laddaArray3(ByVal Antal As Long) As Single()
ReDim sngArr(Antal) As Single
Dim x&, y&, strStr As String, sngRad As Single
For x = 0 To Antal
sngRad = Empty
For y = 0 To 12
sngRad = sngRad + (CSng(Int((3 * Rnd) + 1)) * nollor(y))
Next y
sngArr(x) = sngRad
Next x
laddaArray3 = sngArr
End Function
Private Sub Form_Load()
nollor(0) = 1
nollor(1) = 10
nollor(2) = 100
nollor(3) = 1000
nollor(4) = 10000
nollor(5) = 100000
nollor(6) = 1000000
nollor(7) = 10000000
nollor(8) = 100000000
nollor(9) = 1000000000
nollor(10) = 10000000000#
nollor(11) = 100000000000#
nollor(12) = 1000000000000#
End Sub
</code>Sv: Ta ut antal nollor i ett tal
Så här är min lösning på problemet att räkna antalet nollor i ett tal:
MsgBox UBound(Split(Format(13023401), "0")) ' Ger talet 2
/Per HultqvistSv: Ta ut antal nollor i ett tal
<code>
dim Tal as single 'Numret
dim lngTemp as string
dim strTemp as string 'Variabeln innehållande antalet nollor
strTemp = cstr(Tal)
lngTemp = len(strTemp)
strTemp = replace(strTemp, "0", "")
lngTemp = lngTemp - len(strTemp)
msgbox "Det fanns " & cstr(lngTemp) & " nollor i talet " & cstr(Tal)
</code>
Det borde fungera
:-)Sv: Ta ut antal nollor i ett tal
>ps visst är singel snabbaste datatypen om man måste använda 13 siffror??
Single kan inte inehålla 13 siffror 7 är max.
Jag skulle använda Currency i ditt fall.
Skall fundera lite på en lösnning.
/SvenSv: Ta ut antal nollor i ett tal
Båda lösningar var långsamare än mid lösningen men jag har kommit på att man måste räkna hur många siffror som inte är noll (dom olika siffrorna kommer att vara 1,2,8,9). Jag borde veta vid det här laget att nollor försvinner ;)
Jag skickar med hur jag löste det på ett binärt tal. Måste väl finns något liknande sätt eller kanske inte??????
Jag håller på med ett stryktips program och har gjort några lösningar på reduceringar som har varit både snabba och med bra resultat(få rader) men dom funkade bara på sin specifika reducering. Nu tänkte jag få till en lösning som var mer flexibel alltså den skulle gå att använda på dom flesta reduceringarna men problemet jag har är att den är lite för långsam just nu.
Jag har en kass dator men vill att det ska funka iaf hjälpligt på denna (under 1 minut). Just nu funkar det hyfsat upp till 8 helgarderingar men den ska ju klara 13 (tror inte själv att det är möjligt att komma under 1 minut med 13 helg men om jag lyckas få 11helg under 1minut kan jag fortsätta). Den här delen av uträkningen tar ca 40% av tiden. Jag tror jag kan kapa en hel del tid från den andra delen också.
Lösning 1 är ca 6 gånger snabbare än lösning 2 så det finns mycket tid att tjäna.
Public Const BitMask_0 = &H1
Public Const BitMask_1 = &H2
Public Const BitMask_2 = &H4
Public Const BitMask_3 = &H8
Public Const BitMask_4 = &H10
Public Const BitMask_5 = &H20
Public Const BitMask_6 = &H40
Public Const BitMask_7 = &H80
Public Const BitMask_8 = &H100
Public Const BitMask_9 = &H200
Public Const BitMask_10 = &H400
Public Const BitMask_11 = &H800
Public Const BitMask_12 = &H1000
Tal1 = 8111
Tal2 = 234
XOR_Tal = Tal1 Xor Tal2
intAntalRattTecken = Abs(((XOR_Tal And BitMask_0) > 0) + ((XOR_Tal And BitMask_1) > 0) + ((XOR_Tal And BitMask_2) > 0) + ((XOR_Tal And BitMask_3) > 0) + ((XOR_Tal And BitMask_4) > 0) + ((XOR_Tal And BitMask_5) > 0) + ((XOR_Tal And BitMask_6) > 0) + ((XOR_Tal And BitMask_7) > 0) + ((XOR_Tal And BitMask_8) > 0) + ((XOR_Tal And BitMask_9) > 0) + ((XOR_Tal And BitMask_10) > 0) + ((XOR_Tal And BitMask_11) > 0) + ((XOR_Tal And BitMask_12) > 0))