1. 程式人生 > >經典題:羅馬數字和阿拉伯數字的相互轉換

經典題:羅馬數字和阿拉伯數字的相互轉換

package Linkedin;

public class RomeToArabic {

	public static void main(String[] args) {
		String s = "IV";
		System.out.println(r2a(s));
		System.out.println(a2r(34));
	}
	
	//羅馬數字轉阿拉伯數字:
	// 從前往後遍歷羅馬數字,如果某個數比前一個數小,則把該數加入到結果中;
	// 反之,則在結果中兩次減去前一個數並加上當前這個數;
	// I、V、X、   L、   C、     D、     M
	// 1.5、10、50、100、500、1000
	private static int r2a(String in){
		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 = in.toCharArray();
		
		// 遍歷這個數,用sum來總計和
		int sum = graph[num[0]];
		
		for(int i=0; i<num.length-1; i++){
			// 如果,i比i+1大的話,直接相加
			if(graph[num[i]] >= graph[num[i+1]]){
				sum += graph[num[i+1]];
			}
			// 如果i比i+1小的話,則將總和sum減去i這個地方數的兩倍,同時加上i+1
			// 就相當於後邊的數比左邊的數大,則用右邊的數減左邊的數
			else{
				sum = sum + graph[num[i+1]] - 2*graph[num[i]];
			}
		}
		
		return sum;
	}
	
	// 阿拉伯數字轉羅馬數字:
	// 把所有小數字在前的組合也作為基本數字,再做一個對應的數值表就可以解決問題了。
	// I、V、X、   L、   C、     D、     M
	// 1.5、10、50、100、500、1000
	private static String a2r(int aNumber){
		if(aNumber < 1 || aNumber > 3999){
            return "-1";
        }
 
        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"};
        String rNumber = "";
 
        for(int i=0; i<aArray.length; i++){
            while(aNumber >= aArray[i]){
                rNumber += rArray[i];
                aNumber -= aArray[i];
            }
        }
 
        return rNumber;
	}

}

相關推薦

經典羅馬數字阿拉伯數字相互轉換

package Linkedin; public class RomeToArabic { public static void main(String[] args) { String s = "IV"; System.out.println(r2a(s))

Java經典羅馬數字阿拉伯數字相互轉換

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

分析、測試與總結羅馬數字阿拉伯數字轉換[roman to integer and integer to roman in c++]

【本文連結】 【題目】 給出一個羅馬數字,轉換為阿拉伯數字。本題只考慮3999以內的數。 羅馬數字有如下符號: Ⅰ(1)Ⅴ(5)Ⅹ(10)L(50)C(100)D(500)M(1000) 計數規則: (1).若干相同數字連寫表示的數是這些羅馬數字的和,如III=3; (2).小數字在大數字

13 12羅馬數字阿拉伯數字互相轉換

一 羅馬數字轉阿拉伯數字 【羅馬數字】 1~9: {“I”, “II”, “III”, “IV”, “V”, “VI”, “VII”, “VIII”, “IX”}; 10~90: {“X”, “XX”, “XXX”, “XL”, “L”, “LX”,

前端演算法羅馬數字變成阿拉伯數字 羅馬數字是由七個不同的符號來表示I,V,X,L,C,DM

羅馬數字是由七個不同的符號來表示I,V,X,L,C,D和M。 鍵:值 I 1 V 5 X 10 L 50 C 100 D

羅馬數字阿拉伯數字互化 java實現

首先我們來看一下羅馬數字的表數方法: 1.羅馬數字採用七個羅馬字母作數字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500) 2.相同的數字連寫,所表示的數等於這些數字相加得到的數,如 Ⅲ=3; 3.小的數字在大的數

SOS, 請教XMLstruct之間相互轉換的問題

現在配置基本都像XML方向轉變。那麼, 1、以前是按struct大小直接寫入檔案的,反過來,就直接按struct大小讀入struct就可以了,簡潔; 2、轉XML後,涉及到struct到xml節點之間的相互轉換,這個非常多的重複程式碼。而且太繁瑣,舉個例子,假設一個配置struct有100個欄位,

LeetCode 羅馬數字阿拉伯數字轉換

羅馬數字->阿拉伯數字 Roman to Integer class Solution { public: int romanToInt(string s) { map<char, int> mymap = { {'I

中文數字阿拉伯數字相互轉換

[TOC] > 阿拉伯數字肯定是使用最廣泛的符合之一了。我們日常生活都離不開數字。中文下的數字是中國特色的數字。開發中也會遇到需要兩者相互轉換的需求。今天就來實現下。 # 中文數字轉阿拉伯數字 ![](http://oytmxyuek.bkt.clouddn.com/20200722001.jpg)

遞歸回溯問題的四道經典N皇后,組合,全排列,二叉樹路徑

組合和排列問題的實質是對N叉樹的遍歷,只是退出條件不同。 1.組合 描述:給出兩個整數n和k,返回從1……n中選出的k個數的組合。 樣例: 例如 n = 4 且 k = 2 返回的解為: [[2,4],[3,4],[2,3],[1,2],[1,3

C#實戰小技巧(九)List<string>string[]的相互轉換

List是string型別列表,string[]是string型別陣列,二者可以互相轉換。 1.string[]轉List string[] strArray = {"a", "ab", "abc"}; List<string> strList = new List<s

演算法與設計經典大整數乘法(教材2-4)

給定兩個整數u和v,他們分別有m和n為數字,且m≤n,用通常的乘法求uv的值需要O(mn)時間,可以將u和v均看作是有n位數字的大整數,用本章介紹的分治法,在O(n^(log3))時間內計算uv的值,當m<<n時,此法效率不高。設計演算法在O(nlog2/3)時間計算uv的值 在O(

【劍指offer】1-10C++Java版

劍指offer  面試題1:賦值運算子函式 題目:如下為型別CMyString 的宣告,請為該型別新增賦值符函式。 class CmyString { public:     CmyString(char* pData = nullptr);     CmyString(c

羅馬數字阿拉伯數字

public class Main { public static void main(String[] args) { System.out.print

leetcode經典系列------棧佇列

題目一:用佇列實現棧描述:設計一個棧,支援如下操作,這些操作的演算法複雜度需要是常數級,O(1) , 棧的內部儲存資料的結構為佇列,佇列的方法只能包括push、peek(front)、pop、size、empty等標準的佇列方法思路:利用兩個佇列實現棧 class MyStack{ public:

LeetCode303區域檢索——陣列不可變

常規思路: 這道題說白了就是要你寫一個函式,這個函式有兩個int型的形參i和j,分別表示陣列的兩個下標,然後需要返回這兩個下標及其之間的所有數的和。如果只考慮單次呼叫的需求的話,直接從i到j累加就完了。但說明中提到,函式會被多次呼叫。那麼如果每次呼叫都從i到j累加一遍的話,之前累加的結

計蒜客 挑戰難題 第14羅馬數字轉換成整數

給定一個羅馬數字s,( I<=s<=MMMCMXCIX)(即1到3999),將羅馬數字轉換成整數。 如羅馬數字I,II,III,IV,V分別代表數字1, 2, 3, 4, 5。 格式:    第一行輸入一個羅馬數字,接下來輸出對應的整數。 提示:    首先要來了解一下羅馬數字表示法,基本字元

計蒜客--第28的分隔子集

第28題:等和的分隔子集 時間限制 1000 ms 記憶體限制 10000 K 曉萌希望將1到N的連續整陣列成的集合劃分成兩個子集合,且保證每個集合的數字和是相等。例如,對於N=3,對應的集合{1,2,3}能被劃分成{3} 和 {1,2}兩個子集合. 這兩

leetcode Roman to Integer羅馬數字阿拉伯數字互轉

羅馬數字規則: 1, 羅馬數字共有7個,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。 羅馬數字中沒有“0”。 2, 重複次數:一個羅馬數字最多重複3次。

Python程式設計namedtuple命名元組dict字典相互轉換

from collections import namedtuple dct = { "name": "Tom", "age": 24 } Person = namedtuple("