Oprettet tir. d. 03. februar 2004 kl. 00:03:12

lklingenberg
lklingenberg (18.890 point. Point ude: 0)

Bryde tal op i bestanddele - optimering af script

Hi E,

Jeg har et 5-cifret tal jeg gerne skulle have brudt ned i mindre bestanddele, da jeg skal bruge de enkelte dele i forskellige sammenhænge. Tag fx tallet 40823. Dette tal er (i denne sammenhæng) en kode for fire tal:

40000
40800
40820
40823

Dvs. at tallet er opbygget således: 4-08-2-3, hvor det første ciffer kan være 1-9, andet ciffer 0-99, tredje og fjerde ciffer 0-9.

Det jeg således har brug for er en metode til at hive de enkelte tal ud. Det afgørende er hastigheden hvormed det sker, hvorfor det gerne skulle holdes som simple taloperationer og ikke konverteres til tekststrenge.

Jeg har selv bikset følgende sammen. Det virker, men spm er om det kan gøres hurtigere og/eller simplere.

Code = CLng(40823)
intCode1 = CLng(Round(Code/10000, 0)*10000)
intCode2 = CLng(Round((Code-intCode1)/100, 0)*100+intCode1)
intCode3 = CLng(Round((Code-intCode2)/10, 0)*10+intCode2)
intCode4 = Code

Derudover skal det være en funktion, der tjekker om intCode2-3 er 0 - sagt på en anden måde: hvis intCode1 er 0, så skal resten ikke findes (for de er pr. definition 0 - numrene 40028, 41107 eller 40004 kan fx ikke eksistere). Det samme for intCode2 og 3. Det har jeg gjort således, men også det vil jeg gerne høre nogle bud på forbedringer af.

intCode1 = CLng(Round(Code/10000, 0)*10000)
If Code-intCode1<>0 Then
  intCode2 = CLng(Round((Code-intCode1)/100, 0)*100+intCode1)
  If Code-intCode2<>0 Then
    intCode3 = CLng(Round((Code-intCode2)/10, 0)*10+intCode2)
    If Code-intCode3<>0 Then intCode4 = Code
  End If
End If

Skrevet tir. d. 03. februar 2004 kl. 00:13:24| #1

arne_v
arne_v (1.005.403 point)
intCode1 = (Code \ 10000) * 10000
intCode2 = ((Code mod 10000) \ 100) * 100
etc. må være lidt hurtigere

Skrevet tir. d. 03. februar 2004 kl. 00:32:12| #2

lklingenberg
lklingenberg (18.890 point)
Så må det jo nødvendigvis være:

intCode1 = (Code\10000)*10000
intCode2 = ((Code Mod 10000)\100)*100+intCode1
intCode3 = ((Code Mod 10000)\10)*10+intCode1
intCode4 = Code

for at få koderne ud som 5-cifrede.
Hm, tja... den var nu egentlig snedigt nok - den modulator sammen med operatoren \ er jo ganske nyttig. Halvdelen er pointene er så godt som hjemme ;-)

Hvad med anden del af mit spm.? Kan det optimeres?

Skrevet tir. d. 03. februar 2004 kl. 00:42:12| #3

arne_v
arne_v (1.005.403 point)
Jeg kan faktisk ikke helt gennemskue logikken i anden dek af spørgsmålet.

Jeg læser nemlig din tekst og din kode som værende 2 forskellige ting.

Udfra teksten ville jeg bruge:

If intCode1 <> 0 Then
...
End If

Men du bruger:

If (Code - intCode1) <> 0 Then
...
End If

Men under alle omstændigheder kan det næppe optimeres.

<> og - er meget billige operationer.

Skrevet tir. d. 03. februar 2004 kl. 00:56:32| #4

lklingenberg
lklingenberg (18.890 point)
Ja, når Time()>midnat, så falder min formuleringsevne eksponentielt med tiden ;-)

Det, jeg leder efter, er et script, der stopper udregningen af koder, når den første værdi ramme 0. Ved at bruge Code-intCode1, Code-intCode2, etc. kan jeg teste, om den næste kode vil være 0 (ud fra om der er en rest eller ej), allerede inden jeg begynder at regne på den næste kode. Jeg tænkte, at det ville være hurtigere end at regne koden ud for derefter at konstatere, at værdien er 0.

Gider du et svar?

Skrevet tir. d. 03. februar 2004 kl. 00:58:58| #5

lklingenberg
lklingenberg (18.890 point)
Gider du et svar? Hrmpf! Ja, en enkelt stavefejl kan ændre end sætnings mening temmelig meget... Det skulle naturligvis have været: GIVER du et svar?

Skrevet tir. d. 03. februar 2004 kl. 01:03:22| #6


Skrevet tir. d. 03. februar 2004 kl. 01:49:33| #7

lklingenberg
lklingenberg (18.890 point)
TAK for hjælpen!

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Udskrive mappens navn

Oprettet den 8. februar 2012 kl. 13.32
no_doubt giver 60 point for svar | Giv et svar »

Flere tæller/counter SQL og ASP!

Oprettet den 7. februar 2012 kl. 20.09
denny giver 30 point for svar | Giv et svar »

hjælp til fejl

Oprettet den 1. februar 2012 kl. 10.54
sth giver 100 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Gør dig selv en tjeneste: Køb et ordentligt SD-kort

Der kan være meget stor hastighedsforskel på to umiddelbare ens SD-kort. Se her hvad du skal være opmærksom på, når du køber ekstra hukommelse til din mobil, tablet eller kamera.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Gratis flysimulator fra Microsoft

Den legendariske Flight Simulator fra Microsoft genopstår den 29. februar - og denne gang er spillet gratis.


Nyheder fra Computerworld

Teaser billede

Bank: Derfor er login uden NemID helt i orden

Der er ikke hold i påstanden om sikkerhedsproblemer i forbindelse med bankkunders login uden brug af NemID, lyder det fra Nykredit Bank.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger