Java實現(xiàn)的求解經(jīng)典羅馬數(shù)字和阿拉伯數(shù)字相互轉(zhuǎn)換問題示例
本文實例講述了Java實現(xiàn)的求解經(jīng)典羅馬數(shù)字和阿拉伯數(shù)字相互轉(zhuǎn)換問題。分享給大家供大家參考,具體如下:
古羅馬帝國開創(chuàng)了輝煌的人類文明,但他們的數(shù)字表示法的確有些繁瑣,尤其在表示大數(shù)的時候,現(xiàn)在看起來簡直不能忍受,所以在現(xiàn)代很少使用了。之所以這樣,不是因為發(fā)明表示法的人的智力的問題,而是因為一個宗教的原因,當時的宗教禁止在數(shù)字中出現(xiàn)0的概念!
羅馬數(shù)字的表示主要依賴以下幾個基本符號:
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
這里,我們只介紹一下1000以內(nèi)的數(shù)字的表示法。
單個符號重復多少次,就表示多少倍。最多重復3次。比如:CCC表示300 XX表示20,但150并不用LLL表示,這個規(guī)則僅適用于I X C M。
如果相鄰級別的大單位在右,小單位在左,表示大單位中扣除小單位。比如:IX表示9 IV表示4 XL表示40 更多的示例參見下表,你找到規(guī)律了嗎?
I,1
II,2
III,3
IV,4
V,5
VI,6
VII,7
VIII,8
IX,9
X,10
XI,11
XII,12
XIII,13
XIV,14
XV,15
XVI,16
XVII,17
XVIII,18
XIX,19
XX,20
XXI,21
XXII,22
XXIX,29
XXX,30
XXXIV,34
XXXV,35
XXXIX,39
XL,40
L,50
LI,51
LV,55
LX,60
LXV,65
LXXX,80
XC,90
XCIII,93
XCV,95
XCVIII,98
XCIX,99
C,100
CC,200
CCC,300
CD,400
D,500
DC,600
DCC,700
DCCC,800
CM,900
CMXCIX,999
本題目的要求是:請編寫程序,由用戶輸入若干個羅馬數(shù)字串,程序輸出對應的十進制表示。
輸入格式是:第一行是整數(shù)n,表示接下來有n個羅馬數(shù)字(n<100)。以后每行一個羅馬數(shù)字。羅馬數(shù)字大小不超過999。
要求程序輸出n行,就是羅馬數(shù)字對應的十進制數(shù)據(jù)。
例如,用戶輸入:
3
LXXX
XCIII
DCCII
則程序應該輸出:
80
93
702
import java.util.Scanner;
/**
* 請編寫程序,由用戶輸入若干個羅馬數(shù)字串,程序輸出對應的十進制表示。
*
* 輸入格式是:第一行是整數(shù)n,表示接下來有n個羅馬數(shù)字(n<100)。以后每行一個羅馬數(shù)字。羅馬數(shù)字大小不超過999。
*
* 要求程序輸出n行,就是羅馬數(shù)字對應的十進制數(shù)據(jù)。
*
* 例如,用戶輸入: 3 LXXX XCIII DCCII
*
* 則程序應該輸出: 80 93 702
*
* @author Administrator
*
*/
public class RomeToArabic {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("腳本之家測試結(jié)果:");
Scanner mScanner = new Scanner(System.in);
System.out.println(r2a(mScanner.nextLine()));
System.out.println(a2r(mScanner.nextInt()));
}
/**
* 把羅馬數(shù)字轉(zhuǎn)換為阿拉伯數(shù)字
*
* @param m
* @return
*/
public static int r2a(String m) {
int graph[] = new int[400];
graph['I'] = 1;
graph['V'] = 5;
graph['X'] = 10;
graph['L'] = 50;
graph['C'] = 100;
graph['D'] = 500;
graph['M'] = 1000;
char[] num = m.toCharArray();
int sum = graph[num[0]];
for (int i = 0; i < num.length - 1; i++) {
if (graph[num[i]] >= graph[num[i + 1]]) {
sum += graph[num[i + 1]];
} else {
sum = sum + graph[num[i + 1]] - 2 * graph[num[i]];
}
}
return sum;
}
/**
* 把阿拉伯數(shù)字轉(zhuǎn)換為羅馬數(shù)字
*
* @param number
* @return
*/
public static String a2r(int number) {
String rNumber = "";
int[] aArray = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
String[] rArray = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X",
"IX", "V", "IV", "I" };
if (number < 1 || number > 3999) {
rNumber = "-1";
} else {
for (int i = 0; i < aArray.length; i++) {
while (number >= aArray[i]) {
rNumber += rArray[i];
number -= aArray[i];
}
}
}
return rNumber;
}
}
運行結(jié)果:

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
jmeter設(shè)置全局變量與正則表達式提取器過程圖解
這篇文章主要介紹了jmeter設(shè)置全局變量與正則表達式提取器過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10
Spring?Boot?集成?Swagger2構(gòu)建?API文檔
這篇文章主要介紹了Spring?Boot?集成?Swagger2構(gòu)建?API文檔,通過使用?Swagger,我們只需要按照它所給定的一系列規(guī)范去定義接口以及接口的相關(guān)信息,然后它就能幫我們自動生成各種格式的接口文檔,方便前后端開發(fā)者進行前后端聯(lián)調(diào),下文需要的朋友可以參考一下2022-03-03
深入淺出Java mvc_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了MVC的基礎(chǔ)知識,MVC是一個框架模式,它強制性的使應用程序的輸入、處理和輸出分開,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08

