Prevod medzi rímskymi a arabskými číslicami v jazyku Java

1. Úvod

Starí Rimania vyvinuli svoj vlastný číselný systém nazývaný rímske číslice. Systém používa na vyjadrenie čísel písmená s rôznymi hodnotami. Rímske číslice sa v niektorých menších aplikáciách používajú dodnes.

V tomto tutoriále implementujeme jednoduché prevádzače, ktoré budú prevádzať čísla z jedného systému do druhého.

2. Rímske číslice

V rímskom systéme máme 7 symbolov, ktoré predstavujú čísla:

  • Ja predstavuje 1
  • V. predstavuje 5
  • X predstavuje 10
  • Ľ predstavuje 50
  • C. predstavuje 100
  • D predstavuje 500
  • M predstavuje 1 000

Ľudia pôvodne predstavovali štvorku s IIII alebo 40 s XXXX. To môže byť dosť nepríjemné čítať. Je tiež ľahké zameniť si štyri symboly vedľa seba za tri symboly.

Rímske číslice používajú odčítavaciu notáciu vyhnúť sa takýmto chybám. Namiesto toho, aby povedal štyrikrát jeden (IIII), dá sa povedať, že je jeden menej ako päť (IV).

Ako je to dôležité z nášho pohľadu? Je to dôležité, pretože namiesto jednoduchého pridávania čísel symbol po symbole bude možno potrebné skontrolovať nasledujúci symbol, aby sme určili, či sa má číslo pridať alebo odčítať.

3. Model

Definujme enum predstavujúce rímske číslice:

enum RomanNumeral {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); hodnota súkromného int; RomanNumeral (int value) {this.value = value; } public int getValue () {návratová hodnota; } public static List getReverseSortedValues ​​() {return Arrays.stream (values ​​()) .sorted (Comparator.comparing ((RomanNumeral e) -> e.value) .reversed ()) .collect (Collectors.toList ()); }}

Všimnite si, že sme definovali ďalšie symboly, ktoré nám pomôžu pri odčítaní notácie. Definovali sme aj ďalšiu metódu s názvom getReverseSortedValues ​​().

Táto metóda nám umožní explicitne načítať definované rímske číslice v zostupnom poradí hodnôt.

4. Rímska až arabská

Rímske číslice môžu predstavovať iba celé čísla od 1 do 4 000. Pomocou nasledujúceho algoritmu môžeme previesť rímske číslo na arabské číslo (iterácia symbolmi v opačnom poradí od M do Ja):

Číslom LET je vstupný reťazec Reťazec predstavujúci rímsku číslicu Symbol LET sa má pôvodne nastaviť na hodnotu RomanNumeral.values ​​() [0] WHILE numeral.length> 0: AK číslica začína menom symbolu: do výsledku pridajte hodnotu symbolu, odstráňte názov symbolu z začiatok číslice ELSE: nastaví symbol na nasledujúci symbol

4.1. Implementácia

Ďalej môžeme implementovať algoritmus v Jave:

public static int romanToArabic (reťazcový vstup) {reťazec romanNumeral = input.toUpperCase (); int vysledok = 0; Zoznam romanNumerals = RomanNumeral.getReverseSortedValues ​​(); int i = 0; while ((romanNumeral.length ()> 0) && (i 0) {hodiť novú IllegalArgumentException (vstup + "nemožno previesť na rímske číslo");} vrátiť výsledok;}

4.2. Test

Na záver môžeme otestovať implementáciu:

@Test public void given2018Roman_WhenConvertingToArabic_ThenReturn2018 () {String roman2018 = "MMXVIII"; int výsledok = RomanArabicConverter.romanToArabic (roman2018); assertThat (výsledok) .isEqualTo (2018); }

5. Arabčina až Roman

Pomocou nasledujúceho algoritmu môžeme prevádzať z arabských na rímske číslice (prechádzajúce cez symboly v opačnom poradí od) M do Ja):

LET number je celé číslo od 1 do 4 000 LET symbolom je RomanNumeral.values ​​() [0] LET výsledkom môže byť prázdny reťazec WHILE number> 0: AK je hodnota symbolu <= number: pripojí výsledok k názvu symbolu, odčíta hodnotu symbolu od čísla INÉ: vyberte nasledujúci symbol

5.1. Implementácia

Ďalej môžeme implementovať algoritmus:

public static String arabicToRoman (int number) {if ((number 4000)) {throw new IllegalArgumentException (number + "is not in range (0,4000]");} List 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 ++;}} návrat sb.toString ();}

5.2. Test

Na záver môžeme otestovať implementáciu:

@ Test public void given1999Arabic_WhenConvertingToRoman_ThenReturnMCMXCIX () {int arabic1999 = 1999; Výsledok reťazca = RomanArabicConverter.arabicToRoman (arabsky 1999); assertThat (výsledok) .isEqualTo ("MCMXCIX"); }

6. Záver

V tomto rýchlom článku sme si ukázali, ako prevádzať medzi rímskymi a arabskými číslicami.

Použili sme enum reprezentovať množinu rímskych číslic a vytvorili sme triedu nástrojov na vykonávanie prepočtov.

Kompletnú implementáciu a všetky testy nájdete na GitHub.


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