המרה בין ספרות רומיות לערביות בג'אווה

1. הקדמה

הרומאים הקדומים פיתחו מערכת מספרית משלהם הנקראת ספרות רומיות. המערכת משתמשת באותיות עם ערכים שונים כדי לייצג מספרים. ספרות רומיות משמשות עד היום בכמה יישומים קלים.

במדריך זה נבצע ממירים פשוטים שיהפכו מספרים ממערכת אחת לאחרת.

2. ספרות רומיות

במערכת הרומית יש לנו 7 סמלים המייצגים מספרים:

  • אני מייצג 1
  • ו מייצג 5
  • איקס מייצג 10
  • ל מייצג 50
  • ג מייצג 100
  • ד מייצג 500
  • M מייצג 1000

במקור, אנשים היו מייצגים 4 עם IIII או 40 עם XXXX. זה יכול להיות די לא נוח לקרוא. קל לטעות בארבעה סמלים זה ליד זה בשלושה סמלים.

ספרות רומיות משתמשות בסימון חיסור כדי להימנע מטעויות כאלה. במקום להגיד ארבע פעמים אחת (IIII), אפשר לומר שזה אחד פחות מחמש (IV).

איך זה חשוב מבחינתנו? חשוב מכיוון שבמקום פשוט להוסיף סמל מספרים לפי סמל, נצטרך לבדוק את הסמל הבא כדי לקבוע אם יש להוסיף או לחסר את המספר.

3. מודל

בואו נגדיר אנומוס לייצוג הספרות הרומיות:

מספר רומני {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); ערך אינטי פרטי; RomanNumeral (ערך int) {this.value = value; } public int getValue () {return value; } רשימה סטטית ציבורית getReverseSortedValues ​​() {return Arrays.stream (values ​​()) .sorted (Comparator.comparing ((RomanNumeral e) -> e.value) .reversed ()) .collect (Collectors.toList ()); }}

שימו לב שהגדרנו סמלים נוספים שיעזרו בסימון החיסור. הגדרנו גם שיטה נוספת בשם getReverseSortedValues ​​().

שיטה זו תאפשר לנו לאחזר במפורש את הספרות הרומיות שהוגדרו בסדר ערך יורד.

4. רומית לערבית

ספרות רומיות יכולות לייצג מספרים שלמים בין 1 ל 4000. אנו יכולים להשתמש באלגוריתם הבא כדי להמיר ספרה רומאית למספר ערבי (איטרציה באמצעות סמלים בסדר הפוך מ- M ל אני):

ספרת LET תהיה הקלט. מחרוזת המייצגת סמל ספרתי רומאי. צריך להיות ראשוני מוגדר ל- RomanNumeral.values ​​() [0] WHILE numeral.length> 0: IF הספרה מתחילה בשם הסמל: הוסף את ערך הסמל לתוצאה הסר את שם הסמל מה התחלת הספרה ELSE: הגדירו את הסמל לסמל הבא

4.1. יישום

לאחר מכן נוכל ליישם את האלגוריתם ב- Java:

סטטי ציבורי int romanToArabic (קלט מחרוזת) {מחרוזת romanNumeral = input.toUpperCase (); תוצאה int = 0; רשימת romanNumerals = RomanNumeral.getReverseSortedValues ​​(); int i = 0; בעוד ((romanNumeral.length ()> 0) && (i 0) {לזרוק IllegalArgumentException חדש (קלט + "לא ניתן להמיר מספר רומאי");} תוצאת החזרה;}

4.2. מִבְחָן

לבסוף נוכל לבדוק את היישום:

@ מבחן בטל פומבי שניתן 2018 Roman_WhenConvertingToArabic_ThenReturn2018 () {String roman2018 = "MMXVIII"; int result = RomanArabicConverter.romanToArabic (roman2018); assertThat (תוצאה). isEqualTo (2018); }

5. ערבית לרומית

אנו יכולים להשתמש באלגוריתם הבא כדי להמיר מספרים ערבית לספרות רומיות (לחזור באמצעות סמלים בסדר הפוך מ- M ל אני):

מספר LET יהיה מספר שלם בין 1 ל 4000 סמל LET להיות RomanNumeral.values ​​() [0] LET תוצאה תהיה ריקה מחרוזת WHILE מספר> 0: IF סמל ערך <= מספר: להוסיף את התוצאה עם שם הסמל להפחית את ערך הסמל מהמספר ELSE: בחר בסמל הבא

5.1. יישום

בשלב הבא נוכל ליישם את האלגוריתם:

סטטי ציבורי מחרוזת arabicToRoman (מספר int) {if ((number 4000)) {throw new IllegalArgumentException (number + "is not in range (0,4000]");} List romanNumerals = RomanNumeral.getReverseSortedValues ​​(); int i = 0 ; StringBuilder sb = StringBuilder חדש (); בעוד ((number> 0) && (i <romanNumerals.size ())) {RomanNumeral currentSymbol = romanNumerals.get (i); if (currentSymbol.getValue () <= number) { sb.append (currentSymbol.name ()); number - = currentSymbol.getValue ();} אחר {i ++;}} להחזיר sb.toString ();}

5.2. מִבְחָן

לבסוף נוכל לבדוק את היישום:

@ מבט פומבי בטל שנת 1999 Arrabic_WhenConvertingToRoman_ThenReturnMCMXCIX () {int arabic1999 = 1999; תוצאת מחרוזת = RomanArabicConverter.arabicToRoman (arabic1999); assertThat (תוצאה). isEqualTo ("MCMXCIX"); }

6. מסקנה

במאמר מהיר זה, הראינו כיצד להמיר בין ספרות רומיות לערבית.

השתמשנו ב- enum כדי לייצג את קבוצת הספרות הרומאיות ויצרנו מחלקת שירות לביצוע ההמרות.

ניתן למצוא את היישום המלא ואת כל הבדיקות ב- GitHub.


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