Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Ta ut antal nollor i ett tal

Postades av 2002-12-04 19:37:10 - Daniel Hermansson, i forum visual basic - allmänt, Tråden har 5 Kommentarer och lästs av 1000 personer

Det känns som allting går för långsamt kanske det beror på min kassa dator men över till frågan.

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>


Svara

Sv: Ta ut antal nollor i ett tal

Postades av 2002-12-04 20:10:34 - Per Hultqvist

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 :-)

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 Hultqvist


Svara

Sv: Ta ut antal nollor i ett tal

Postades av 2002-12-04 20:13:32 - Oskar Johansson

Skulle tänka mig:
<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
:-)


Svara

Sv: Ta ut antal nollor i ett tal

Postades av 2002-12-04 20:14:26 - Oskar Johansson

Hm... Undrar om min eller din lkösning är snabbast... ;-)


Svara

Sv: Ta ut antal nollor i ett tal

Postades av 2002-12-05 06:40:07 - Sven Åke Persson

Hej
>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.
/Sven


Svara

Sv: Ta ut antal nollor i ett tal

Postades av 2002-12-05 10:33:30 - Daniel Hermansson

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?

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))


Svara

Nyligen

  • 11:52 Noen erfaring med uttak hos Mostbe
  • 11:51 Noen erfaring med uttak hos Mostbe
  • 20:22 Spel
  • 17:07 Snabb och trevlig webbplats utan l
  • 17:00 Bra spelsajt med bonusar
  • 15:51 Slappna av
  • 15:17 Onlineunderhållning på fritiden
  • 11:13 Online Kasino

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 095
27 955
271 725
1 433
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies