羅馬數字


??? 古羅馬帝國開創了輝煌的人類文明,但他們的數字表示法的確有些繁瑣,尤其在表示大數的時候,現在看起來簡直不能忍受,所以在現代很少使用了。之所以這樣,不是因為發明表示法的人的智力的問題,而是因為一個宗教的原因,當時的宗教禁止在數字中出現0的概念!

??? 羅馬數字的表示主要依賴以下幾個基本符號:

??? I? 1
??? V? 5
??? X? 10
??? L? 50
??? C? 100
??? D? 500
??? M? 1000

??? 這里,我們只介紹一下1000以內的數字的表示法。

??? 單個符號重復多少次,就表示多少倍。最多重復3次。比如:CCC表示300? XX表示20,但150并不用LLL表示,這個規則僅適用于I X C M。

??? 如果相鄰級別的大單位在右,小單位在左,表示大單位中扣除小單位。比如:IX表示9? IV表示4? XL表示40
??? 49 = XLIX
??? 更多的示例參見下表,你找到規律了嗎?
?? ?
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

??? 本題目的要求是:請編寫程序,由用戶輸入若干個羅馬數字串,程序輸出對應的十進制表示。

??? 輸入格式是:第一行是整數n,表示接下來有n個羅馬數字(n<100)。以后每行一個羅馬數字。羅馬數字大小不超過999。

??? 要求程序輸出n行,就是羅馬數字對應的十進制數據。

??? 例如,用戶輸入:
3
LXXX
XCIII
DCCII

??? 則程序應該輸出:
80
93
702

/*
方法一
*/
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();String[] a = new String[n];for (int i = 0; i < n; i++)a[i] = sc.next();sc.close();for (int i = 0; i < n; i++)System.out.println(check(a[i]));}static int check(String s) {char[] chars = s.toCharArray();int N = 0;for (int i = 0; i < chars.length;) {int t = 0;if (i == chars.length - 1) {t = f(chars[i]);i++;}if (i + 1 < chars.length)if (isIXCM(chars[i])) {int count = 1;int j = i+1;while (j < chars.length && chars[i] == chars[j] && count <= 3) {count++;j++;}if (count > 1) {t = f(chars[i]) * count;i += count;} else if (count == 1) {if (f(chars[i]) < f(chars[i + 1])) {t = f(chars[i + 1]) - f(chars[i]);i += 2;} else if (f(chars[i]) >= f(chars[i + 1])) {t = f(chars[i]);i++;}}} else {if (f(chars[i]) < f(chars[i + 1])) {t = f(chars[i + 1]) - f(chars[i]);i += 2;} else if (f(chars[i]) >= f(chars[i + 1])) {t = f(chars[i]);i++;}}N += t;}return N;}static boolean isIXCM(char c) {return c == 'I' || c == 'X' || c == 'C' || c == 'M';}static int f(char c) {int n = 0;switch (c) {case 'I':n = 1;break;case 'V':n = 5;break;case 'X':n = 10;break;case 'L':n = 50;break;case 'C':n = 100;break;case 'D':n = 500;break;case 'M':n = 1000;break;}return n;}}
/*
方法二:建立一個表,每兩個字符匹配
*/import java.util.Scanner;public class Test2 {static int[][] table;static int M = 7, N = 7;public static void main(String[] args) {createTable();Scanner sc = new Scanner(System.in);int n = sc.nextInt();String[] a = new String[n];for (int i = 0; i < n; i++)a[i] = sc.next();sc.close();createTable();for (int i = 0; i < n; i++)System.out.println(check(a[i]));}static int check(String s) {char[] chars = s.toCharArray();int T = 0;int i = 0;while (i + 1 < chars.length) {T += table[charToIndex(chars[i])][charToIndex(chars[i + 1])];i += 2;}if (i == chars.length - 1)T += charToInt(chars[i]);return T;}static void createTable() {table = new int[M][N];for (int i = 0; i < M; i++) {for (int j = 0; j < N; j++) {table[i][j] = f3(i, j);}}}static int f3(int i, int j) {int t1 = charToInt(indexToChar(i)), t2 = charToInt(indexToChar(j));if (t2 > t1) {return t2 - t1;}return t1 + t2;}static int charToInt(char c) {int n = 0;switch (c) {case 'I': n = 1;break;case 'V': n = 5;break;case 'X': n = 10;break;case 'L': n = 50;break;case 'C': n = 100;break;case 'D': n = 500;break;case 'M': n = 1000;break;}return n;}static char indexToChar(int i){switch (i){case 0:return 'I';case 1:return 'V';case 2:return 'X';case 3:return 'L';case 4:return 'C';case 5:return 'D';}return 'M';}static int charToIndex(char c){switch (c){case 'I':return 0;case 'V':return 1;case 'X':return 2;case 'L':return 3;case 'C':return 4;case 'D':return 5;}return 6;}
}

?

轉載于:https://www.cnblogs.com/Alpharun/p/8676202.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250647.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

匯編 --- 從磁盤(扇區2到18)上讀取數據到內存中

下面代碼讀取柱面:0,磁頭:0,扇區從2到18的數據到內存 0x8200~0xa3ff處 需要明白以下幾點: 給定柱面,磁頭,一個扇形區域是512字節,對應的物理可以理解為512個燈泡組(一個燈泡組有8個小燈泡)確定讀取到內存中的位置 為什么是0x8200:因為0x8000~0x81ff這512個字節要留給啟動區.為…

那些值得思考的PHP問題

那些值得思考的PHP問題 1、關于弱類型 函數strpos是返回字符串str2在str1的位置&#xff0c;沒有找到則返回false&#xff0c;然而如果在實際應用上返回的位置是0&#xff0c;在if語句中0也被當作false&#xff0c;所以我們需要對false做類型判斷&#xff0c; $str1 yabadaba…

Lvs Tun隧道模式配置

######## TUN是IP Tunneling &#xff0c;IP隧道的簡稱&#xff0c;它將調度器收到的IP數據包封裝在一個新的IP數據包中&#xff0c;轉交給應用服務器&#xff0c;然后實際服務器的返回數據會直接返回給用戶。 工作原理&#xff1a; 用戶請求負載均衡服務器&#xff0c;當IP數…

mysql-常用sql

記錄下工作中常用的sql 刪除重復數據 delete from student where id not in (select min(id) from student group by name); -- 該語句在mysql下會報錯&#xff0c; -- 執行報錯&#xff1a;1093 - You cant specify target table student for update in FROM clause -- 原因是…

優雅的使用Laravel之phpstorm配置

優雅的使用Laravel之phpstorm配置 先打開一個Laravel 項目&#xff0c;然后在project tool 窗口選擇根節點、然后右鍵->Composer | Init composer 。 如果你的電腦里沒有composer.phar&#xff0c;可以點擊鏈接來下載。然后點擊項目 composer->add denpendency.. 搜索ba…

算法 --- 求兩個集合的并集

const unionL (l1, l2)>{for(let i0; i <l1.length; i){if(l2.indexOf(l1[i]) -1){l2.push(l1[i])}}return l2 }let l1 [1,2,3,4]; let l2 [1,2,5]; console.log(unionL(l1,l2)); //[1, 2, 5, 3, 4]

java實驗四——找鞍點

package hello;public class 實驗四 {public static void main(String[] args) {// TODO Auto-generated method stubint[][] a {{9,8,6},{2,3,1},{8,5,2}};System.out.println("二維數組為&#xff1a;");for(int i0;i<a.length;i){for(int j0;j<a[i].length;…

BZOJ 4551樹題解

好吧&#xff0c;洛谷的數據比較水暴力就可以過。。。。&#xff08;而且跑到飛快&#xff09; 不過&#xff08;BZ水不過去&#xff09;還是講講正規的做法。 其實一眼可以看出可以樹剖&#xff0c;但是&#xff0c;碼起來有點麻煩。 其實有一種更簡單的離線做法。 我們很容易…

es6 --- 使用Symbol保護私有變量

定義一個人物類 假設其屬性有姓名和性別我們希望,性別在聲明后就固定不變 傳統方法 var Person (function(){var _gender ;function P(name, gender){this.name name;_gender gender;}P.prototype.getGender function(){return _gender;}return P; })();var p1 new Pe…

組合數

long long factorial(int n) {long long m 1;for(int i1;i<n;i)m*i;return m; } long long C(int n,int m) {return factorial(n)/(factorial(m)*factorial(n-m));//可能會溢出 } 正解&#xff1a; long long C(int n,int m) {if(m<n-m) m n-m;long long ans 1;for(in…

Mysql中的聯合索引、前綴索引、覆蓋索引

Mysql中的聯合索引、前綴索引、覆蓋索引 索引 索引是一種特殊的文件&#xff0c;它們包含著對數據表里所有記錄的引用指針。更通俗的說&#xff0c;數據庫索引好比是一本書前面的目錄&#xff0c;能加快數據庫的查詢速度。 聯合索引 又名復合索引&#xff0c;由兩個或多個列…

LVM邏輯卷管理

什么是邏輯卷&#xff1f;因為可以將文件系統像卷一樣伸長或縮短之故。 LVM做法&#xff0c;將幾個物理分區或磁盤&#xff0c;通過軟件組合成為一塊看起來是獨立的大磁盤&#xff08;VG&#xff09;&#xff0c;然后將這塊大磁盤再經過分成可使用分區&#xff08;LV&#xff0…

es6 --- 自制迭代器

對象 對象如下 const obj {left: 100,top: 200 }不可迭代 for(let attr of obj){console.log(attr); }迭代規則 可迭代,所具有的屬性[Symbol.iterator] 需要自己給obj添加迭代規則 obj[Symbol.iterator] () >{// 獲取obj的所有鍵let keys Object.keys(obj);let len …

軟件工程的實踐項目課程的自我目標

對實踐項目完成后學習到的能力的預期&#xff1a;這算是自己第一次參加的團隊合作的軟件實踐吧&#xff0c;以前自己搞的小“玩意”&#xff0c;實難登大雅之堂&#xff0c;期待實踐項目后--->1、自己的代碼能力能夠有較明顯的提高&#xff0c;代碼更加規范。 2、提升團隊合…

[Shell] swoole_timer_tick 與 crontab 實現定時任務和監控

手動完成 "任務" 和 "監控" 主要有下面三步&#xff1a; 1. mission_cron.php&#xff08;定時自動任務腳本&#xff09;&#xff1a; <?php /*** 自動任務 定時器 (5s 執行).** swoole_timer_tick 解決秒級定時&#xff1b;* 如需調整&#xff0c;注意…

關于項目調研

一、檸檬時代app 1、作品內容&#xff1a; 該作品主要為每一所高校的大學生量身定制的手機生活助手&#xff0c;由您自主運營的校園手機客戶端。開放的自定義平臺&#xff0c;匯聚本校周邊所有生活服務、外賣商家、娛樂休閑、新鮮事兒、知名社團、周邊商鋪、校園達人等欄目。 …

html 標簽

html概述 超文本標記語言&#xff08;英語&#xff1a;HyperText Markup Language&#xff0c;簡稱&#xff1a;HTML&#xff09;是一種用于創建網頁的標準標記語言。HTML是一種基礎技術&#xff0c;常與CSS、JavaScript一起被眾多網站用于設計令人賞心悅目的網頁、網頁應用程序…

es6 --- forEach的實現

forEach的第一個參數 接收回調函數 let a [a, b, c]; a.forEach((v, k ,s)>{console.log(v, k ,s);console.log(this); })v: valuek: keys: 代表數組a本身this指向當前函數執行所在的作用域,即window forEach的第二個參數. forEach第1個參數用于接收回調函數,第2個參數…

java Calendar

1.1 Calendar類概念 Calendar是日歷類&#xff0c;在Date后出現&#xff0c;替換掉了許多Date的方法。該類將所有可能用到的時間信息封裝為靜態成員變量&#xff0c;方便獲取。 Calendar為抽象類&#xff0c;由于語言敏感性&#xff0c;Calendar類在創建對象時并非直接創建&…

結對項目之需求分析與原型設計

結對項目之需求分析與原型設計 031402317 李佳愷 031402511 黃家俊 這是我們兩個人第一次合作&#xff0c;雖然結對是棟哥幫我們分配的&#xff0c;并且一開始我們就認識&#xff0c;但是也很開心有這個機會能一起合作完成任務。 初步分工我負責隨筆&#xff0c;家俊負責原型設…