leetcode 羅馬數字轉化為整數:給定乙個羅馬數字,將其轉換為整數。輸入保證在1到3999之間。
羅馬數字定義:
羅馬數字共有七個,即i(1),v(5),x(10),l(50),c(100),d(500),m(1000)。按照下面的規則可以表示任意正整數。 重複數次:乙個羅馬數字重複幾次,就表示這個數的幾倍。 右加左減:
在乙個較大的羅馬數字的右邊記上乙個較小的羅馬數字,表示大數字加小數字。
在乙個較大的數字的左邊記上乙個較小的羅馬數字,表示大數字減小數字。
但是,左減不能跨越等級。比如,99不可以用ic表示,用xcix表示。 加線乘千:在乙個羅馬數字的上方加上一條橫線或者在右下方寫m,表示將這個數字乘以1000,即是原數的1000倍。同理,如果上方有兩條橫線,即是原數的1000000倍。 單位限制:同樣單位只能出現3次,如40不能表示為***x,而要表示為xl。
組合規則:
(1) 基本數字 ⅰ、x 、c 中的任何乙個,自身連用構成數目,或者放在大數的右邊連用構成數目,都不能超過三個;放在大數的左邊只能用乙個。
(2) 不能把基本數字 v 、l 、d 中的任何乙個作為小數放在大數的左邊採用相減的方法構成數目;放在大數的右邊採用相加的方式構成數目,只能使用乙個。
(3) v 和 x 左邊的小數字只能用 ⅰ。
(4)l 和 c 左邊的小數字只能用 。
(5)d 和 m 左 邊的小數字只能用 c 。
還有一點需要格外注意:
mcm是1900
mcmxcvi是1996
按照邏輯 遍歷到c 的處理,mc先m+c,但是遍歷到第二個m的時候,順序是cm,這個時候要減去這個c以及之前多加的c,也就是減去兩個c。
例子:xcix 是 99 遍歷到第二個x時,+10-2*1
好好體會上面的,下面**實現:
#include
using namespace std;
class solution
return res;
}int chartoint(char s)
}};int main()
一直從左往右轉化,為什麼不考慮一下從右往左轉化呢?
//89ms
int romantoint1(string s)
else
res -= chartoint(s[i]);
}return res;
}最後我還發現了乙個我從未用過的方法:效率最高。
//52ms
#include
int romantoint2(string s), , , , , , };
int res = 0;
for (int i = 0; i < s.size(); ++i)
else
}return res;
}上面這個演算法充分利用了羅馬數字兩個數字前後順序的關係,也就是說如果是i在v前面,也就是iv,它代表4,反之代表6。再搭配c++的無序map,可以巧妙的通過陣列來進行判斷而達到對ret或加或減的目的。
羅馬數字轉化
先看位置計數的定義 一種表達數字的系統,數字按照順序排列 每個數字有乙個位值,數字的值是每個數字和位值的乘積之和。電腦科學導論 p25 羅馬數字計數法 相同的數字連寫,所表示的數等於這些數字相加得到的數,如 3 小的數字在大的數字的右邊,所表示的數等於這些數字相加得到的數,如 8 12 小的數字 限...
阿拉伯數字轉化為羅馬數字
include include include define rows 4 define cols 4 int nums rows cols char roms rows cols 二維的陣列指標 void judge int num 判斷輸入的數字是否在制定範圍內 void trans int n...
羅馬數字轉化為阿拉伯數字
羅馬數字是位置計數嗎?位置計數是一種表達數字的系統,數字按照順序排列 每個數字有乙個位值,數字的值是每個數字和位值的乘積之和。羅馬數字包含七個基本符號 i 1 v 5 x 10 l 50 c 100 d 500 m 1000 相同的數字連寫,所表示的數等於這些數字相加得到的數 小的數字在大的數字的右...