計蒜課 整數轉換成羅馬數字

2021-08-10 21:48:13 字數 1928 閱讀 6638

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...