Pretvaranje između rimskih i arapskih brojeva u Javi

1. Uvod

Stari su Rimljani razvili vlastiti numerički sustav nazvan rimskim brojevima. Za predstavljanje brojeva sustav koristi slova s ​​različitim vrijednostima. Rimski se brojevi i danas koriste u nekim manjim primjenama.

U ovom ćemo uputstvu implementirati jednostavni pretvarači koji će transformirati brojeve iz jednog sustava u drugi.

2. Rimski brojevi

U rimskom sustavu imamo 7 simbola koji predstavljaju brojeve:

  • Ja predstavlja 1
  • V predstavlja 5
  • x predstavlja 10
  • L predstavlja 50
  • C predstavlja 100
  • D predstavlja 500
  • M predstavlja 1000

Izvorno su ljudi nekada predstavljali četvero s IIII ili 40 s XXXX. Ovo može biti prilično neugodno za čitanje. Također je lako zamijeniti četiri simbola jedan uz drugi za tri simbola.

Rimski brojevi koriste se oduzimajućim zapisom kako bi se izbjegle takve pogreške. Umjesto da kaže četiri puta jedan (IIII), može se reći da je jedan manje od pet (IV).

Koliko je to važno iz naše perspektive? Važno je jer ćemo umjesto jednostavnog dodavanja brojeva simbol po simbol možda trebati provjeriti sljedeći simbol kako bismo utvrdili treba li broj dodati ili oduzeti.

3. Model

Definirajmo enum koji će predstavljati rimske brojeve:

enum Rimskibroj {I (1), IV (4), V (5), IX (9), X (10), XL (40), L (50), XC (90), C (100), CD ( 400), D (500), CM (900), M (1000); privatna int vrijednost; RomanNumeral (int value) {this.value = value; } public int getValue () {povratna vrijednost; } javni statički popis getReverseSortedValues ​​() {return Arrays.stream (values ​​()). sorted (Comparator.comparing ((RomanNumeral e) -> e.value) .reversed ()) .collect (Collectors.toList ()); }}

Primijetite da smo definirali dodatne simbole koji će vam pomoći u oduzimanju zapisa. Također smo definirali dodatnu metodu imenovanu getReverseSortedValues ​​().

Ova metoda omogućit će nam da eksplicitno dohvatimo definirane rimske brojeve silaznim redoslijedom vrijednosti.

4. Rimski na arapski

Rimski brojevi mogu predstavljati samo cijele brojeve između 1 i 4000. Sljedeći algoritam možemo koristiti za pretvaranje rimskog broja u arapski broj (ponavljajući simbole obrnutim redoslijedom od M do Ja):

LET brojka je ulazni niz koji predstavlja rimski broj LET simbol se u početku postavlja na RomanNumeral.values ​​() [0] DOK JE numral.length> 0: AKO brojka počinje s imenom simbola: dodajte vrijednost simbola u rezultat, uklonite ime simbola iz brojčani početak ELSE: postavite simbol na sljedeći simbol

4.1. Provedba

Dalje, algoritam možemo implementirati u Javi:

javni statički int romanToArabic (String input) {String romanNumeral = input.toUpperCase (); rezultat int = 0; Popis romanNumerals = RomanNumeral.getReverseSortedValues ​​(); int i = 0; while ((romanNumeral.length ()> 0) && (i 0) {throw new IllegalArgumentException (input + "ne može se pretvoriti u rimski broj");} return result;}

4.2. Test

Konačno, možemo testirati implementaciju:

@Test javna praznina dana2018Roman_WhenConvertingToArabic_ThenReturn2018 () {String roman2018 = "MMXVIII"; int rezultat = RomanArabicConverter.romanToArabic (roman2018); assertThat (rezultat) .isEqualTo (2018); }

5. s arapskog na rimski

Sljedeći algoritam možemo koristiti za pretvaranje iz arapskih u rimske brojeve (itiranje kroz simbole obrnutim redoslijedom od M do Ja):

LET broj mora biti cijeli broj između 1 i 4000 LET simbol mora biti RomanNumeral.values ​​() [0] LET rezultat mora biti prazan Niz DOK JE BROJ> 0: AKO vrijednost simbola <= broj: dodati rezultat s imenom simbola oduzeti vrijednost simbola od broja OSTALO: odaberite sljedeći simbol

5.1. Provedba

Dalje, sada možemo implementirati algoritam:

javni statički niz arabicToRoman (int broj) {if ((broj 4000)) {baciti novi IllegalArgumentException (broj + "nije u rasponu (0,4000]");} Popis romanNumerals = RomanNumeral.getReverseSortedValues ​​(); int i = 0 ; StringBuilder sb = new StringBuilder (); while ((number> 0) && (i <romanNumerals.size ())) {RomanNumeral currentSymbol = romanNumerals.get (i); if (currentSymbol.getValue () <= number) { sb.append (currentSymbol.name ()); number - = currentSymbol.getValue ();} else {i ++;}} return sb.toString ();}

5.2. Test

Konačno, možemo testirati implementaciju:

@Test javna praznina given1999Arabic_WhenConvertingToRoman_ThenReturnMCMXCIX () {int arabic1999 = 1999; Rezultat niza = RomanArabicConverter.arabicToRoman (arabic1999); assertThat (rezultat) .isEqualTo ("MCMXCIX"); }

6. Zaključak

U ovom kratkom članku pokazali smo kako pretvoriti između rimskih i arapskih brojeva.

Koristili smo nabrajanje predstavljati skup rimskih brojeva i stvorili smo klasu korisnosti za izvođenje pretvorbi.

Kompletna implementacija i svi testovi mogu se naći na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found