1000ms,65536k
給定乙個整數 num,將整數轉換成羅馬數字。
如 1, 2, 3, 4, 5 對應的羅馬數字分別為i,ii,iii,iv,v等,更詳細的說明見此鏈結。
第一行輸入乙個整數 num(1≤num≤3999)。
輸出 num 對應的羅馬數字。
123
cxxiii
m
dclx
vi1000
500100
501051
1. 相同的數字連寫、所表示的數等於這些數字相加得到的數、如:ⅲ=3;
2. 小的數字在大的數字的右邊、所表示的數等於這些數字相加得到的數、 如:ⅷ=8、ⅻ=12;
3. 小的數字(限於 i、x 和 c)在大的數字的左邊、所表示的數等於大數減小數得到的數、如:ⅳ=4、ⅸ=9;
4. 正常使用時、連寫的數字重複不得超過三次
要將乙個整數num(1≤num≤3999)轉成羅馬數字,首先我們可以對它進行分解:
進製數mdc
lxvi
數值1000
500100
501051
數值表示
r0r1
r2r3
r4r5
r6個數
a0a1
a2a3
a4a5a6n
um=∑
airi
,i=0
→6其中ai
=(nu
m−∑a
jrj)
/ri,
j=0→
i−1
上式的除法為整數整除。這裡的分解是從大進製到小進製分解。一般情況下,按第1,2條規則,a
i為多少,對應的羅馬字元就有多少個;但由於第3,4條規則的限制,所以我們還需要對ai進行修正以及進製數字置進行修正。
根據上面的分解公式可知:
1. 對於進製為d(500), l(50), v(5)來說,0≤ai≤1,因為如果超過1,就會向前進製;
對於m(1000), c(100), x(10), i(1)l來說,0≤ai≤4,因為如果超過4,就會向前進製;
2. 當乙個數某部分需要用到進製相減來表示時,可以相減的兩個進製數距離不會超過2個進製距離。否則,這個數一定可以分成出中間的進製,可以用列舉去簡單驗證;
3. 被減的進製數一定是i(1), x(10), c(100)
特殊情況主要發生在要進行進製相減導致進製數字置的變化,有兩類這樣的問題:
1. 相鄰兩個進製相減,比如 4:iv,允許我記為「4」問題
2. 相隔1個進製相減,比如 9:ix,記為「9」問題,這種情況相減的時候需要向前借位,高位需要減1。
我是用c語言實現的(事實上檔案儲存為c++)
#include
int main(int argc, char
const *argv) ;
int romannum[7] = ;
int a = 0;
int k[7] = ;
char output[100]; // 將翻譯成的羅馬數字字串輸出到output
scanf("%d", &a);
for (int i = 0; i < 7; i++)
a = 0; // 重新利用a,作為陣列下標
for (int i = 6; i >= 0; i--) else
if (k[i] == 4 && k[i-1] == 1) else }}
// 逆序輸出
for (int i = a - 1; i >= 0; i--)
putchar('\n');
return
0;}
計蒜客 整數轉換成羅馬數字
給定乙個整數 numnumnu m,將整數轉換成羅馬數字。如 1,2,3,4,51,2,3,4,51,2,3,4,5 對應的羅馬數字分別為i,ii,iii,iv,v等,更詳細的說明見此 鏈結。第一行輸入乙個整數 num 1 num 3999 num 1 leq num leq 3999 nu m 1...
計蒜客 羅馬數字轉換成整數
給定乙個羅馬數字 ss s,將羅馬數字轉換成整數。如羅馬數字i,ii,iii,iv,v分別代表數字 1,2,3,4,51,2,3,4,51,2,3,4,5。首先要來了解一下羅馬數字表示法,基本字元有 77 7 個 i v x l c d m,分別表示 11 1 55 5 101010 505050 ...
計蒜客 整數轉換成羅馬數字
整數轉換成羅馬數字 給定乙個整數 numnu m,將整數轉換成羅馬數字。如 1,2,3,4,51,2,3,4,51,2,3,4,5 對應的羅馬數字分別為i,ii,iii,iv,v等,更詳細的說明見此 鏈結。第一行輸入乙個整數 num 1 leq num leq 3999 nu m 1 num 399...