羅馬數字轉整數的演算法

2022-04-26 07:30:08 字數 2305 閱讀 1061

# 羅馬數字包含以下七種字元: i, v, x, l,c,d 和 m。

## 字元 數值

# i 1

# v 5

# x 10

# l 50

# c 100

# d 500

# m 1000

# 例如, 羅馬數字 2 寫做 ii ,即為兩個並列的 1。12 寫做 xii ,即為 x + ii 。 27 寫做 xxvii, 即為 xx + v + ii 。

## 通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 iiii,而是 iv。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 ix。這個特殊的規則只適用於以下六種情況:

## i 可以放在 v (5) 和 x (10) 的左邊,來表示 4 和 9。 iv=4 ix=9

# x 可以放在 l (50) 和 c (100) 的左邊,來表示 40 和 90。 xl=40 xc=90

# c 可以放在 d (500) 和 m (1000) 的左邊,來表示 400 和 900。cd=400 cm=900

# 給定乙個整數,將其轉為羅馬數字。輸入確保在 1 到 3999 的範圍內。

#

拿到這道題時,我首先想的是建立乙個roman數列,裡面從小到大儲存著所有的羅馬字元,同時建立乙個字典從小到大儲存著羅馬字元以及其對應的數量大小。如下所示:

roman = ['i', 'v', 'x', 'l', 'c', 'd', 'm']

roman_value =

解題思路則是,將拿到的羅馬數字用for迴圈取值,一次取兩個。若是取到的第乙個字元比第二個字元小,則加上第二個字元代表的值減去第乙個字元代表的值(如ix=10-1=9),否則加上第二個數字的值。然後再判斷第二個字元和第三個字元......

首次解題時,我寫出了如下演算法:

def romantoint(s):

res = 0

for i in s: # i:第乙個數

if s.index(i) != len(s) + 1:

j = s[s.index(i) + 1] #出錯 由於x出現了兩次,當取i='x'時,index(i)會預設取第乙個'x'的索引

if roman_value[i] < roman_value[j]:

res += roman_value[j] - roman_value[i]

res -= roman_value[j]

# 由於第二次迴圈還是會迴圈到j,相當於再加了一次j,所以直接先減去以抵消

else:

res += roman_value[i]

else:

res += roman_value[i]

return res

在轉換『mxcix』,也就是羅馬字元的1099時,輸出的答案為1079。然後我debug出了乙個我無法解決bug。

我使用了.index的方法,也就是根據每次迴圈取到的具體字元 i 來反推這個字元在原字串 s 中的索引,並且根據這個索引+1的值來取到下乙個值.但是我在使用這種方法的時候沒有考慮到字元可能重複出現的情況.就比如在轉換『mxcix』時,當 i 取到第二個x(高亮x)時, s.index(i)任然是第乙個x的索引,導致程式出錯.

這個bug以我現在的知識無法解決,於是我在查閱一些資料後寫出了改進演算法:

def romantoint(s):

res = 0

for i,v in enumerate(s): # i:索引 v:值

if i != len(s)-1:

j = s[i + 1] #j: s中以i+1為索引的值

if roman_value[v] < roman_value[j]:

res += roman_value[j] - roman_value[v]

res -= roman_value[j]

else:

res += roman_value[v]

else:

res += roman_value[v]

return res

主要改進是使用了enumerate(列舉)這個方法,它的作用是分別返回索引以及值.這樣就在迴圈的一開始確定了索引和值,而不是通過值反推索引,這樣會因為重複出現的值出bug.

反思:enumerate真好真好用啊

演算法練習 羅馬數字轉整數與整數轉羅馬數字

13.羅馬數字轉整數 羅馬數字包含以下七種字元 i,v,x,l,c,d和m。字元 數值 i 1 v 5 x 10 l 50 c 100 d 500 m 1000 例如,羅馬數字 2 寫做ii,即為兩個並列的 1。12 寫做xii,即為x ii。27 寫做xxvii,即為xx v ii。通常情況下,羅...

演算法 羅馬數字轉整數

羅馬數字包含以下七種字元 i,v,x,l,c,d和m。字元數值i 1 v 5 x 10 l 50 c 100 d 500 m 1000例如,羅馬數字 2 寫做ii,即為兩個並列的 1。12 寫做xii,即為x ii。27 寫做xxvii,即為xx v ii。通常情況下,羅馬數字中小的數字在大的數字的...

演算法 羅馬數字轉整數

羅馬數字包含以下七種字元 i,v,x,l,c,d和m。例如,羅馬數字 2 寫做 ii 即為兩個並列的 1。12 寫做 xii 即為 x ii 27 寫做 xxvii,即為 xx v ii 通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 iiii,而是 iv。數字 1 ...