Avatar billede lklingenberg Nybegynder
03. februar 2004 - 00:03 Der er 6 kommentarer og
1 løsning

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
Avatar billede arne_v Ekspert
03. februar 2004 - 00:13 #1
intCode1 = (Code \ 10000) * 10000
intCode2 = ((Code mod 10000) \ 100) * 100
etc. må være lidt hurtigere
Avatar billede lklingenberg Nybegynder
03. februar 2004 - 00:32 #2
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?
Avatar billede arne_v Ekspert
03. februar 2004 - 00:42 #3
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.
Avatar billede lklingenberg Nybegynder
03. februar 2004 - 00:56 #4
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?
Avatar billede lklingenberg Nybegynder
03. februar 2004 - 00:58 #5
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?
Avatar billede arne_v Ekspert
03. februar 2004 - 01:03 #6
svar
Avatar billede lklingenberg Nybegynder
03. februar 2004 - 01:49 #7
TAK for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester