Avatar billede billeschou Nybegynder
27. september 2001 - 14:23 Der er 29 kommentarer og
2 løsninger

algoritme til konvertering af arabertal til romertal (og omvendt)

Kan en sådan algoritme laves?
Man kan selvfølgelig \"lave\" et array der indeholder alle tal overhovedet og så slå op i det - men det er vist ikke særligt hensigtsmæssigt ;)

Når jeg tænker problemet igennem løber jeg hele tiden panden mod muren i forbindelse med reglerne for konvertering af romertal (overholder ikke grådighedsprincippet). At der også findes andre romertal end de almindeligt kendte I,V,X,L,C,D og M, gør ikke just problemet nemmere...
Avatar billede disky Nybegynder
27. september 2001 - 14:26 #1
Vi vil konvertere

2001 til romertal

først hvor mange gange går 1000 op i det ?
2 gange, altså MM

Hvor mange gange går 500 op i det ??
og 100, 50,10,5 ?

Hov 1 går op 1 gang

altså er resultatet MMI

Vi prøver med 1999

1 * 1000 = M
1 * 500 = D
4 * 100 = CCCC

Den smarte siger så hov det det kan laves som CM

osv.

Så det er rimelig nemt, fra romertal til arabisk er det bare at gange
Avatar billede billeschou Nybegynder
27. september 2001 - 14:45 #2
disky: 1999 er altså MIM...
Avatar billede billeschou Nybegynder
27. september 2001 - 14:48 #3
...men jeg tror jeg har en løsning:
- scan romertalstrengen igennem tegn for tegn
- hvis romertal[i] < romertal[i+1] så træk fra ellers læg sammen

Konvertering den anden vej rundt arbejder jeg videre på
Avatar billede disky Nybegynder
27. september 2001 - 14:48 #4
det ved jeg godt. men jeg starter jo med at omregne 2001 til romertal.

1999 er ikke regnet færdig pga osv...

Men en smart routine opdager de ting :)
Avatar billede billeschou Nybegynder
27. september 2001 - 14:49 #5
ja men problemet ligger også kun i tal som 1999 (hvor et mindre romertal står foran et større) - det skulle jeg have gjort mere klart :(
Avatar billede disky Nybegynder
27. september 2001 - 14:55 #6
hmm okay :)

SÅ har jeg ikke lige en patent løsning.

Jeg tror ikke du kan lave en simpel algorithme til det.

jeg ville nok bruge tabel løsningen :)
Avatar billede billeschou Nybegynder
27. september 2001 - 14:57 #7
disky - øhmm sådan en tabel ville da blive uendelig stor... medmindre der er noget jeg har overset :)
Avatar billede disky Nybegynder
27. september 2001 - 14:58 #8
yep den er stor hvis du ikke sætter en max grænse.

Hvad bruger man egentligt til at angive enheder større end 1000 ?
Avatar billede billeschou Nybegynder
27. september 2001 - 15:57 #9
hvad mener du med enheder større end 1000?
Avatar billede olebole Juniormester
27. september 2001 - 20:46 #10
<ole>
Nu er romertal jo historisk set ikke et enkelt system...der har været flere forskellige notationer, men hvis du mener den moderne notation af romertal - som man bl.a. kender den fra Hollywood-film - så prøv at søge på Google. Der er masser af \'frem og tilbage\' konvertere på nettet, både som Java appletter og som JavaScripts. F.eks:
  http://www.geocities.com/TimesSquare/Castle/3224/digits.html
  http://www.guernsey.net/~sgibbs/roman.html
/mvh
</bole>
Avatar billede jakoba Nybegynder
28. september 2001 - 01:03 #11
Avatar billede roenving Novice
28. september 2001 - 02:46 #12
>>olebole og jakoba
Ingen af konverterne kunne klare 1999 uden at svare: MCMXCIX, så et eller andet kan forbedres ganske meget i algoritmerne (jakobs var den eneste, som kunne konvertere MIM til 1999)

Nu vil jeg zq lige kigge på det også !·]
Avatar billede olebole Juniormester
28. september 2001 - 02:52 #13
Uden tvivl. Jeg har ikke selv testet dem - prøvede blot lige at søge på det og fandt bunker af resultater. Tog et par af de første  :)
Derudover er Jakobs kode rimelig \'sexy\' i forhold til de andre....fristes næsten til at sige \'anorektisk\'  =)
/mvh
Avatar billede roenving Novice
28. september 2001 - 02:56 #14
Ja, rekursiviteten i romer->araber sikrede faktisk det gode resultat på MIM, men man kan vel forh...... da fange de der småting med 1,5,10 foran 1000 !~]
Avatar billede billeschou Nybegynder
28. september 2001 - 09:07 #15
jakoba: supercool... vil arbejde videre på min ide i weekenden, men den ligner ved første øjekast temmelig meget den du linker til (arrays med romertallene og de tilsvarende værdier i arabertal som hjælp) - forresten konverterer geocities linket MIM til 2001 mens sgibbs bare afviste at konvertere MIM. Det er jo helt galt...
Avatar billede jakoba Nybegynder
28. september 2001 - 09:15 #16
men hvor lang skal man gå?
min har fx:
  MIXCM -> 1909
og det ville jeg nok snarere kalde et ulovligt romertal.
  1909 -> MCMIX | MCIMX | MIXCM  ?
Avatar billede disky Nybegynder
28. september 2001 - 09:27 #17
MIXCM er et ugyldigt romer tal, da du ikke kan lave det trækkefra nummer mere end en gang per tal

1909 er MCMIX
Avatar billede jakoba Nybegynder
28. september 2001 - 09:52 #18
mulig regel så:
det der kan trækkes fra er:
    r  hvor er er ethvert romertalsbogstav
og  rr  hvor r e [ I, X, C ]

men der skal også være noget spillerum for \'ulovlige\' romertal.
i trykkedato har jeg fx set fx:
  MDCCCLXIII  for  1863

og siden CCD og CCC fylder præcis det samme får man vel egentlig kun kompleksitet ud af at bruge  CCD. ingen besparelse.

Er der nogen der kender nogen officielle regler?
 
Avatar billede disky Nybegynder
28. september 2001 - 09:54 #19
Det er korrekt.

Men man må f.eks. ikke sige

VIM for at udtrykke 1000-6 = 994
Avatar billede billeschou Nybegynder
28. september 2001 - 10:06 #20
reglen er vel at man ikke må have en mindre blok (værdimæssigt) foran en større.
F. eks. er CMM forkert mens MCM er korrekt - her er blokkene så CM og M... derfor er CCD iøvrigt også et ulovligt udtryk (CCD = D)
Avatar billede billeschou Nybegynder
28. september 2001 - 10:07 #21
disky: VIM kunne også fortolkes som 999-5 (ikke at det gør nogen forskel...)
Avatar billede jakoba Nybegynder
28. september 2001 - 11:43 #22
det ender med noget i retning af at negative led KUN må være:
  I, II, V, X, XX, L, C, CC, D

Ved extrapolation fra CCM burde CCD vel også være tilladt, men siden CCD ikke sparer noget i forhold til CCC kunne vi evt sige at den skal forstås, men aldrig genereres (ligesom  MDCCCCCLXXXXVIIII). Jeg har set IIV brugt.

romertal -> arabertal  konverteringen bliver så en  mange til een  mens
arabertal -> romertal  konverteringen er  een til een

ps. tak for points

mvh JakobA
Avatar billede olebole Juniormester
28. september 2001 - 12:04 #23
Jakob >> pointen er - som jeg også skrev tidligere - at der har eksisteret flere \'officielle\' regler for romertal...og gør det for den sags skyld stadig. Spørgsmålet er, om der overhovedet er et internationalt regelsæt, der kan kaldes for en officiel standard  :)
/mvh
Avatar billede jakoba Nybegynder
28. september 2001 - 12:09 #24
olebole >> Just præcis.
Og som vanligt løser programmørerne det ved at snakke frem og tilbge og lave deres eget (helt fjerde) \'officielle regelsæt\'.
( Der forhåbentligt holder til man har skiftet firma :-))
Avatar billede olebole Juniormester
28. september 2001 - 12:22 #25
...den senere så berømte \'romertals-inhouse-standard-à-la-Eksperten\'  =)
Avatar billede billeschou Nybegynder
28. september 2001 - 12:24 #26
men stadigvæk: romertal på formen aab er det samme som b (forudsat at a er mindre end og forskellig fra b). Derfor er det forkert at vedtage at CCC og CCD er det samme.

Romer->araber tror jeg nok jeg har klaret, men araber->romer er noget mere tricky at implementere (hvis det altså skal være det \"rigtige\" romertal der kommer ud).
Avatar billede jakoba Nybegynder
28. september 2001 - 12:36 #27
der er jeg uenig.
MCCM er helt klart og ofte anvendt (for 1800). Det er de 2 små der skal grupperes sammen og så trækkes fra.
Avatar billede olebole Juniormester
28. september 2001 - 12:53 #28
Avatar billede billeschou Nybegynder
28. september 2001 - 14:01 #29
tilsyneladende er vi alle galt på den på nogle områder... taget fra dr. math:

Here are the official rules for subtracting letters:

Subtract only powers of ten, such as I, X, or C. Writing VL for 45 is not allowed: write XLV instead.
Subtract only a single letter from a single numeral. Write VIII for 8, not IIX; 19 is XIX, not IXX.
Don\'t subtract a letter from another letter more than ten times greater. This means that you can only subtract I from V or X, and X from L or C, so MIM is illegal

Altså er 1999 != MIM og CCD er ulovligt (regel 3 - subtract only a single letter from a single numeral)
Avatar billede billeschou Nybegynder
28. september 2001 - 14:02 #30
tror bare jeg opgiver at implementere en algoritme (indtil videre) :)
Avatar billede jakoba Nybegynder
28. september 2001 - 14:34 #31
Så:  1999 -> MCMXCIX  bvadr.
men det er nogen rimeligt nemme regler at følge pr computer. mon ikke de er lavet af nogen de skulle programmere det :-))
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